在我的自定义中间件中注入IServiceCollection

时间:2018-07-24 16:13:32

标签: dependency-injection middleware asp.net-core-2.1

我正在尝试制作一个自定义中间件,该中间件在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的中间节点称为SqlServerMiddlewareSqliteMiddleware,依此类推。

0 个答案:

没有答案