skip to Main Content
(31) 98739-9637

Não é possível consumir o serviço com escopo do singleton IHostedService

Hoje neste artigo, abordaremos abaixo os aspectos,

descrição do problema

 

ASP.NET Core usando IHostedService dá erro de tempo de execução,

 

InvalidOperationException : Erro ao validar o descritor de serviço ‘ServiceType: Microsoft.Extensions.Hosting.IHostedService Tempo de vida: Singleton ImplementationType: kafka_api_producer_consumer.TheCodeBuzzConsumer’: não é possível consumir o serviço com escopo ‘SQLDBService.Context.EmployeeContext’ do singleton ‘Microsoft.Extensions.Hosting.IHostedService’ .

 

Não é possível consumir o serviço com escopo do singleton IHostedService

 

Resolução

 

O motivo é que, quando adicionamos AddHostedService ao aplicativo ou API, a instância de serviço é adicionada como instância SingleTon .

 

Como prática recomendada, o EFCore DBContext deve ser definido como uma instância com escopo definido. Na verdade, o EFCore usando AddDBContext permite adicionar uma instância com escopo de DBContext para ser o padrão.

É importante consumir serviços de escopo em instâncias com escopo para evitar corrupção de dados ou problemas de encadeamento.

 

Embora as instâncias de serviço de escopo sejam criadas uma vez por solicitação, geralmente é recomendável que elas sejam resolvidas usando uma instância de serviços com escopo definido que as utilizam. Você pode precisar considerar os aspectos abaixo também antes de resolver o problema.

 

  • Abordagem 1- Usando ServiceScopeFactory para resolver instâncias de escopo

 

1
2
3
4
5
6
7
8
9
10
class TheCodeBuzzConsumer : BackgroundService
   {
       private readonly ILogger<TheCodeBuzzConsumer> _logger;
       private readonly EmployeeContext _employeeContext;
       public TheCodeBuzzConsumer(ILogger<TheCodeBuzzConsumer> logger, IServiceScopeFactory factory)
       {
           _logger = logger;
           _employeeContext = factory.CreateScope().ServiceProvider.GetRequiredService<EmployeeContext>();
       }

 

O código acima permite criar uma instância com escopo de EmployeeContext e é capaz de trabalhar com o banco de dados facilmente.

 

Abordagem 2- Usando IServiceProvider para resolver instâncias de escopo

 

Devemos DI IServiceProvider usando injeção de construtor como abaixo,

 

1
2
3
4
5
6
7
8
9
10
class TheCodeBuzzConsumer : BackgroundService
    {
        private readonly ILogger<TheCodeBuzzConsumer> _logger;
        private readonly EmployeeContext _employeeContext;
        public TheCodeBuzzConsumer(ILogger<TheCodeBuzzConsumer> logger, IServiceProvider serviceProvider)
        {
            _logger = logger;
            _employeeContext = serviceProvider.CreateScope().ServiceProvider.GetRequiredService<EmployeeContext>();
        }

 

  • Ao fazer o procedimento acima, o DBContext será usado com a configuração de tempo de vida definida originalmente.
  • Isso também garantirá que as instâncias Singleton não sejam criadas para os serviços fornecidos.
Não é possível consumir o serviço com escopo do singleton IHostedServices 1

Isso é tudo! Codificação feliz!

Isso ajuda você a resolver seu problema?

Você tem alguma solução ou sugestão melhor? Por favor, expresse seus comentários abaixo.

Fonte: https://www.thecodebuzz.com/cannot-consume-scoped-service-from-singleton-ihostedservice/

Back To Top