Как использовать DbContextPool с Singleton? - PullRequest
0 голосов
/ 19 марта 2019

В моем приложении я делаю интеграции, используя NMS и ActiveMQ. У меня есть слушатели, которые в одиночку слушают очереди сообщений. После получения сообщения слушатель должен обработать его и зарегистрировать в базе данных. Мой DbContext настроен с использованием опции DbContextPool:

        services.AddEntityFrameworkSqlServer();
        services.AddDbContextPool<MyContext>((serviceProvider, options) =>
        {
            options.UseSqlServer(connectionString);
            options.UseInternalServiceProvider(serviceProvider);
        });

Итак, когда я пытаюсь внедрить DbContext в мой ActiveMqListener класс, я получаю ошибку:

InvalidOperationException: Cannot consume scoped service 'MyApp.Data.MyContext' from singleton 'MyApp.Integrations.ActiveMqListener'.

Как я могу получить один из контекстов в пуле и освободить его, когда моя работа завершит обработку одного сообщения? Есть ли другой рекомендуемый способ сделать это?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 марта 2019

В соответствии с документацией ASP.NET Core DI Service :

Разрешать выделенную службу из одного экземпляра опасно.Это может привести к неправильному состоянию службы при обработке последующих запросов.

По умолчанию AddDbContext или AddDbContextPool регистрируют DbContext как службу Scoped.Вы потребляете свой DbContext в ActiveMqListener классе, который был зарегистрирован как Singleton услуга.Вот в чем проблема!

Решение: зарегистрируйте свой ActiveMqListener в ASP.NET Core DI как ScopedService в Startup.ConfigureServices методе.

Примечание. Если выобязаны использовать ActiveMqListener как Singleton, а затем зарегистрировать свой DbConext как Singleton также следующим образом:

services.AddDbContext<MyContext>((serviceProvider, options) =>
        {
            options.UseSqlServer(connectionString);
            options.UseInternalServiceProvider(serviceProvider);
        }, ServiceLifetime.Singleton); // <-- Here it is
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...