Как я могу воспользоваться преимуществами пула DbContext из ASP.NET Жизненный цикл ядра?

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

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

Вопрос:

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

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

Я передаю поток, используя реактивный 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. Самостоятельно использовать / внедрять внутренний класс Microsoft DbContextPool, несмотря на предупреждения, он строго предназначен для внутреннего использования, и API может измениться
  4. Найдите способ отделить его от ASP.NET Жизненный цикл ядра MVC без изменения способа его функционирования, т.Е. найдите способ воспользоваться внедрением зависимостей в моем варианте использования.
  5. * открыт для предложений

Комментарии:

1. Хороший улов, спасибо. Маркетинг Microsoft может быть … разочаровывающим. Похоже, они просто называют это ASP.NET core MVC. Обзор ASP.NET Core MVC

Ответ №1:

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

Оказывается, мы можем внедрить поставщика услуг для создания наших собственных экземпляров через 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 в 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>();
    //...
}