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
IServiceProviderpara 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
IHostedServiceouBackgroundService.
IMongoDBClient
- Essa classe dentro do .NET precisa ser singleton porque ela é
thread-safee foi feita para realizar o re-use. Documentação que indica o singleton: https://mongodb.github.io/mongo-csharp-driver/2.7/reference/driver/connecting/#re-use
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.