使用Simple Injector和.Net Core註冊DB Context

asp.net-core c# entity-framework-core simple-injector

嗨,我正在使用Simple Injector作為我的應用程序DI。我保留了框架DI的默認DI。

但我需要註冊DbContext與SimpleInjector。當我運行應用程序時

container.Verify()

給出以下錯誤

ActivationException:UsersDbContext類型的構造函數包含名稱為'options'的參數,並鍵入未註冊的DbContextOptions。請確保已註冊DbContextOptions,或更改UsersDbContext的構造函數。

我在函數SimpleInjectorConfig.InitializeContainer(app, _container)使用SimpleInjectore註冊SimpleInjectorConfig.InitializeContainer(app, _container)

// DbContext
container.Register<DbContext, UsersDbContext>();

我的初創公司是

public void ConfigureServices(IServiceCollection services)
{
    var conString = Configuration.GetConnectionString("DefaultConnection");

    // Add framework services.
    services.AddDbContext<UsersDbContext>(options => options.UseSqlServer(conString));

    services.AddIdentity<User, IdentityRole>()
            .AddEntityFrameworkStores<UsersDbContext>()
            .AddDefaultTokenProviders();

    IdentityConfigurationService.ConfigureIdentityOptions(services);

    services.AddMvc();

    // Add application services
    services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(_container));
    services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(_container));

    services.UseSimpleInjectorAspNetRequestScoping(_container);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    SimpleInjectorConfig.InitializeContainer(app, _container);

    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    _container.Verify();

    app.UseMvc();
}

我知道問題在於選項,但我不知道Simple Injector如何需要註冊到容器的默認連接字符串。這可以傳遞給Simple Injector嗎?或者我應該使用DbContextFactory將連接字符串傳遞給UserDbContext

一般承認的答案

您需要告訴SimpleInjector如何實例化UsersDbContext ,它似乎具有類型為DbContextOptions的參數的構造DbContextOptions

通過使用Register方法的重載來更改註冊DbContext的方式,該方法採用如下所示的委託(工廠)參數:

container.Register<DbContext>(() => {
    var options = // Configure your DbContextOptions here
    return new UsersDbContext(options);
});

熱門答案

這不是我要求的答案,但它是我最終使用的替代方案。也許這對未來的其他人可能有用

我從默認的DI容器中交叉連接DbContext。

container.Register(app.ApplicationServices.GetService<UsersDbContext>, Lifestyle.Singleton);

在查看我的DI配置後,我覺得這是一個更好的解決方案,因為我的DbContext只在一個地方註冊。我很高興將它留在那裡,因為我正在使用Entity Framework和Identity。這兩個都註冊到我保留用於註冊Framework依賴項的默認DI容器,他們需要訪問DbContext



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow