Как я могу использовать преимущества пула DbContext из ASP.NET Core LifeCycle? - PullRequest
1 голос
/ 30 марта 2019

У меня есть объект на группу пользователей для управления одновременными изменениями в памяти.С фиксированной скоростью, скажем каждые шесть секунд, я беру текущее состояние изменений и применяю его к базе данных.Важная часть состоит в том, что существует отдельный поток, который требует экземпляра dbcontext, который находится за пределами ASP.NET Core MVC LifeCycle.Это затрудняет, или я не знаю, как я могу воспользоваться уколом непристойности.

Есть ли способ воспользоваться преимуществами AddDbContextPool в этом проблемном пространстве.Кажется, что нет способа напрямую арендовать AppDbContext, и Microsoft предостерегает против создания AppDbContext напрямую, поскольку его API может измениться.Насколько я знаю, у меня нет способа внедрить / сдать контекст моей базы данных в поток, который выполняет работу.

Я передаю поток, используя Reactive API, где я создаю тему и использую линию конвейера образца, как показано в примере ниже:

UpdateSubject
    .Sample(TimeSpan.FromSeconds(6))
    .Subscribe(x => {

        // This is where I'd like to take 
        // advantage of the dbcontext pooling
        using(AppDbContext db = new AppDbContext){

            // ...
            // Iterate Over Changes
            // ...

            db.SaveChanges();
        }

   });

Мои текущие допустимые параметры:

  1. Ничего не делать: архитектура уже объединяет вызовы.
  2. Реализуйте свой собственный пул и исследуйте, как самому сбросить контекст для каждого использования,
  3. Использовать / реализовать внутренний класс MicrosoftDbContextPool сам, несмотря на предупреждения, он строго предназначен для внутреннего использования, и API может измениться
  4. Откройте для себя способ отделить его от жизненного цикла ASP.NET Core MVC без изменения способа его функционирования, IE, найдите способВоспользуйтесь преимуществом внедрения зависимостей в моем случае использования.
  5. * открыт для предложений

1 Ответ

1 голос
/ 30 марта 2019

Задание вопроса помогло мне ответить на свой вопрос или найти решение.Все ниже было протестировано с потоками, работающими вне запроса.

Оказывается, мы можем внедрить поставщика услуг для создания наших собственных экземпляров через API!

ReadOnly IServiceProvider _ServiceProvider;

MySingulation(IServiceProvider serviceProvider)
{
    _ServiceProvider = serviceProvider;
}

Получив дескриптор IServiceProvider посредством внедрения, мы можем использовать MVC Core API для создания экземпляров нашего контекста.

using(var serviceScope = _ServiceProvider.CreateScope())
{
    // Don't get confused -- Call GetService from the serviceScope and 
    // not directly from the member variable _ServiceProvider. 
    var context = serviceScope.ServiceProvider.GetService<YourAppDbContext>();

    // ...
    // Make use of the dbcontext
    // ...

}

Теперь важно помнить, что мы используемMVC Core Pooling в Startup.cs для начала.

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDbContextPool<YourAppDbContext>(options => {
        options.UseSqlServer(settings.Connection);
    });

    // Oh, it's important the singultion was created within Core's LifeCycle/API
    services.AddSingleton<MySingulation>();
    //...
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...