我正在尝试制作一个自定义中间件,该中间件在ApplicationDbContext
方法之外注册ConfigureServices
。基本上,我想移动这个:
_services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(......);
在ConfigureServices
方法之外,并通过自定义中间件到达应用程序管道。
这是我的自定义中间件的样子:
public class MyMW
{
IConfiguration _configuration;
RequestDelegate _next;
IServiceCollection _services;
public MyMW(RequestDelegate next, IServiceCollection services, IConfiguration configuration)
{
_configuration = configuration;
_next = next;
_services = services;
}
public async Task Invoke(HttpContext context)
{
//Add DbContext
_services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(....);
//Add Identity
_services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
......
await _next.Invoke(context);
......
}
}
我在自定义中间件中注入了IServiceCollection
,以使用它在我的中间件中注册数据库提供程序。在Configure
方法中,还有一种使用中间件的扩展方法。
public static class MyMWExtension
{
public static IApplicationBuilder UseMyMW(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMW>();
}
}
我要
InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.DependencyInjection.IServiceCollection' while attempting to activate 'TestProgram.MyMW'.
我想尝试告诉我不能将IServiceCollection
注入自定义中间件。我的最终目标是制作自定义中间件,使我可以使用不同的数据库提供程序。例如,将允许SQLServer的中间节点称为SqlServerMiddleware
,SqliteMiddleware
,依此类推。