Использование Entity Framework Core DbContext Pooling с простым инжектором - PullRequest
0 голосов
/ 31 августа 2018

Рассматривая примеры использования пулов контекста БД, я вижу, что он был разработан для использования с ServiceCollection:

var serviceProvider = new ServiceCollection()
    .AddDbContextPool<AdventureWorksContext>(options => { //options })
    .BuildServiceProvider();

А как насчет простого инжектора? Можно ли зарегистрировать пул БД в контейнере Simple Injector?

p.s. Мое приложение не ASP.NET MVC, это просто DAL

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

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 )

0 голосов
/ 05 декабря 2018

Вы можете использовать

container.Register(() => serviceProvider.GetRequiredService<AdventureWorksContext>());

чтобы ServiceProvider разрешил зависимость по запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...