EF Core DbContext пул в ASP.NET Core
При интеграции Simple Injector в ASP.NET Core вы сохраняете инфраструктуру и сторонние компоненты внутри системы конфигурации .NET Core. Это означает, что включение пулов контекста Entity Framework Core выполняется в точности так, как это документирует Microsoft:
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
Поскольку Simple Injector не заменяет встроенную систему конфигурации , вам придется проинструктировать Simple Injector, чтобы автоматически загружать отсутствующие регистрации (например, DbContext
) из Система конфигурации .NET Core. Это можно сделать с помощью методов расширения AddSimpleInjector
и UseSimpleInjector
, как показано здесь.
private SimpleInjector.Container container;
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore();
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSimpleInjector(container);
container.Verify();
...
}
Используя эту настройку, BloggingContext
можно внедрить в любой компонент, который разрешается из Simple Injector, тогда как BloggingContext
объединяется с Entity Framework.
Пул EF Core DbContext в консольном приложении .NET (Core)
Когда речь идет об использовании пулов контекста Entity Framework Core в консольном приложении .NET Core, решение будет очень похожим, хотя вам придется настроить немного больше:
public void Main()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
var services = new ServiceCollection();
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container);
services
.BuildServiceProvider(validateScopes: true)
.UseSimpleInjector(container);
container.Verify();
// Run application code
using (AsyncScopedLifestyle.BeginScope(container))
{
var service = container.GetInstance<MainService>();
service.DoAwesomeStuff();
}
}
Таким образом, в итоге время жизни DbContext управляется областью MS.DI, но эта область управляется областью Simple Injector.
Пул EF Core DbContext в библиотеке
В случае, если вы создаете библиотеку, то есть не запускаемый проект, пожалуйста, остановите то, что вы делаете. Только начальная сборка приложения должна иметь Composition Root , и только Composition Root должен использовать DI-контейнер (такой как Simple Injector или MS.DI `ServiceCollection). Все остальные библиотеки в вашем приложении должны помнить о (возможном) существовании Контейнера:
Если вы используете DI-контейнер, корень композиции должен быть единственным местом, где вы используете DI-контейнер. Использование DI-контейнера вне корня композиции приводит к анти-шаблону локатора службы ( source )