ASP.NET Core でのサードパーティ コンテナーによるミドルウェアのアクティブ化
Note
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、「.NET および .NET Core サポート ポリシー」を参照してください。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
この記事では、IMiddlewareFactory と IMiddleware を、サードパーティ コンテナーによるミドルウェアのアクティブ化の拡張ポイントとして使用する方法について説明します。 IMiddlewareFactory
と IMiddleware
の概要については、「ASP.NET Core でのファクトリベースのミドルウェアのアクティブ化」を参照してください。
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
このサンプル アプリでは、IMiddlewareFactory
の実装である SimpleInjectorMiddlewareFactory
によるミドルウェアのアクティブ化を示します。 このサンプルでは、Simple Injector 依存関係の挿入 (DI) コンテナーを使用しています。
サンプルのミドルウェアの実装は、クエリ文字列パラメーターで提供された値を記録します (key
)。 ミドルウェアは、メモリ内データベースにクエリ文字列値を記録するのに、挿入されたデータベース コンテキスト (スコープ化されたサービス) を使用します。
Note
このサンプル アプリでは、デモンストレーション目的でのみ Simple Injector を使用しています。 Simple Injector の使用を推奨するものではありません。 Simple Injector のドキュメントと GitHub Issues に記載されているミドルウェアのアクティブ化方法は、Simple Injector の保守担当者たちから推奨されています。 詳細については、Simple Injector のドキュメントと Simple Injector の GitHub リポジトリを参照してください。
IMiddlewareFactory
IMiddlewareFactory では、ミドルウェアを作成するメソッドが提供されます。
サンプル アプリでは、SimpleInjectorActivatedMiddleware
インスタンスを作成するミドルウェア ファクトリが実装されています。 このミドルウェア ファクトリでは、Simple Injector コンテナーを使用してミドルウェアを解決しています。
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware
IMiddleware では、アプリの要求パイプライン用にミドルウェアが定義されます。
IMiddlewareFactory
実装によってアクティブ化されるミドルウェア (Middleware/SimpleInjectorActivatedMiddleware.cs
)。
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(AppDbContext db)
{
_db = db;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
_db.Add(new Request()
{
DT = DateTime.UtcNow,
MiddlewareActivation = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
ミドルウェア (Middleware/MiddlewareExtensions.cs
) の拡張機能が作成されます。
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
はいくつかのタスクを実行する必要があります。
- Simple Injector コンテナーを設定します。
- ファクトリとミドルウェアを登録します。
- Simple Injector コンテナーからアプリのデータベース コンテキストを利用できるようにします。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
ミドルウェアは、要求を処理する Startup.Configure
のパイプラインに登録されます。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
この記事では、IMiddlewareFactory と IMiddleware を、サードパーティ コンテナーによるミドルウェアのアクティブ化の拡張ポイントとして使用する方法について説明します。 IMiddlewareFactory
と IMiddleware
の概要については、「ASP.NET Core でのファクトリベースのミドルウェアのアクティブ化」を参照してください。
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
このサンプル アプリでは、IMiddlewareFactory
の実装である SimpleInjectorMiddlewareFactory
によるミドルウェアのアクティブ化を示します。 このサンプルでは、Simple Injector 依存関係の挿入 (DI) コンテナーを使用しています。
サンプルのミドルウェアの実装は、クエリ文字列パラメーターで提供された値を記録します (key
)。 ミドルウェアは、メモリ内データベースにクエリ文字列値を記録するのに、挿入されたデータベース コンテキスト (スコープ化されたサービス) を使用します。
Note
このサンプル アプリでは、デモンストレーション目的でのみ Simple Injector を使用しています。 Simple Injector の使用を推奨するものではありません。 Simple Injector のドキュメントと GitHub Issues に記載されているミドルウェアのアクティブ化方法は、Simple Injector の保守担当者たちから推奨されています。 詳細については、Simple Injector のドキュメントと Simple Injector の GitHub リポジトリを参照してください。
IMiddlewareFactory
IMiddlewareFactory では、ミドルウェアを作成するメソッドが提供されます。
サンプル アプリでは、SimpleInjectorActivatedMiddleware
インスタンスを作成するミドルウェア ファクトリが実装されています。 このミドルウェア ファクトリでは、Simple Injector コンテナーを使用してミドルウェアを解決しています。
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware
IMiddleware では、アプリの要求パイプライン用にミドルウェアが定義されます。
IMiddlewareFactory
実装によってアクティブ化されるミドルウェア (Middleware/SimpleInjectorActivatedMiddleware.cs
)。
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(AppDbContext db)
{
_db = db;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
_db.Add(new Request()
{
DT = DateTime.UtcNow,
MiddlewareActivation = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
ミドルウェア (Middleware/MiddlewareExtensions.cs
) の拡張機能が作成されます。
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
はいくつかのタスクを実行する必要があります。
- Simple Injector コンテナーを設定します。
- ファクトリとミドルウェアを登録します。
- Simple Injector コンテナーからアプリのデータベース コンテキストを利用できるようにします。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
ミドルウェアは、要求を処理する Startup.Configure
のパイプラインに登録されます。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}
その他の技術情報
ASP.NET Core