Skip to main content

Ciclos de Vida no .NET Dependency Injection | Scoped x Singleton x Transient x HostedService

  • Ciclos de Vida no .NET Dependency Injection | Scoped x Singleton x Transient x HostedService

Ciclos de Vida no .NET Dependency Injection

Transient

  • Uma nova instância é criada a cada injeção (controlador, serviço, etc).
  • Ideal para serviços sem estado.
  • Instância por injeção.

Scoped

  • A mesma instância é usada durante toda a requisição HTTP.
  • Uma nova instância é criada para cada nova requisição.
  • Instância por request.
  • Quando um novo escopo é criado manualmente (por exemplo, com IServiceScopeFactory), uma nova instância scoped também é criada, mesmo dentro da mesma requisição.

Singleton

  • Uma única instância é criada e compartilhada durante todo o ciclo de vida da aplicação.

  • É usada por todas as requisições e serviços.

  • Instância por aplicação.

  • Não é permitido injetar objetos scoped dentro de singletons.

    • Caso necessário, use IServiceProvider para criar um escopo manual e resolver o serviço scoped:

      using (var scope = _serviceProvider.CreateScope())
      {
      var myService = scope.ServiceProvider.GetRequiredService<IMyScopedService>();
      // uso do serviço
      }

HostedService

  • Serviços executados em segundo plano durante a execução da aplicação.
  • Usado para tarefas contínuas ou monitoramento, como consumidores de fila (RabbitMQ, Kafka) ou jobs agendados.
  • Registrado com IHostedService ou BackgroundService.

IMongoDBClient

DBContext

Link do Stackoverflow: https://stackoverflow.com/questions/77033320/should-i-use-mongodb-sql-server-context-with-scope-or-singleton


1º comentário

  • Um DbContext não é uma conexão de banco de dados. Um DbContext abrirá e fechará conexões de banco de dados conforme necessário. Seu DbContext pode ser um singleton somente se:

    • Seu aplicativo garante que ele seja acessado apenas por um thread por vez.
    • Você gerencia o Change Tracker para evitar que ele cresça com o tempo, por exemplo, com ChangeTracker.Clear.
  • O DbContext destina-se a ter como escopo uma unidade de trabalho em seu aplicativo. No aplicativo Win Forms, WCF ou Console, é possível fazer isso. Em qualquer tipo de aplicativo da web, não é realmente viável.

2º comentário

  • DbContext, DbConnection, MongoDb ou RavendDB Session, todos esses tipos de coisas devem ter escopo. Eles podem não ser singleton por um motivo simples: eles não são thread-safe. Os serviços singleton devem ser thread-safe.