DEV Community

👨‍💻 Lucas Silva
👨‍💻 Lucas Silva

Posted on

.Net - Scoped, transient e singleton

Vejo bastante gente com dificuldade em entender a diferença entre os principais tipos de lifecycle quando falamos sobre injeção de dependência em .net. Criei um exemplo no GitHub e vou falar sobre ele.

Basicamente criei 3 serviços bastante simples e parecidos (apenas para fins didáticos) e os injetei utilizando AddSingleton, AddScoped e AddTransient.
Injeção dos serviços no arquivo Program.cs

Esses serviços só possuem uma propriedade, o Id, que é criada no momento da instanciação.
Criei um controller e injetei os serviços por construtor.Injeção dos serviços no construtor

Também injetei uma instância do serviço em cada método.
Injeção dos serviços em cada método

Singleton

O serviço é criado uma única vez e a mesma instância é passada para todas as chamadas dele. Veja que o id, criado no momento da instanciação, foi o mesmo (e continua sendo o mesmo independente da requisição):
Imagem mostra que uma única instância foi criada

Scoped

Uma única instância é criada por requisição. Então se o serviço for chamado em vários lugares em uma única requisição, a mesma instância será passada. Outras instâncias serão criadas para as próximas requisições.

Mesma requisição:
Imagem mostra que uma única instância foi criada

Requisição diferente:
Imagem mostra que uma nova instância foi criada para uma segunda requisição

Transient

Ele é o mais custoso, pois se o serviço for chamado em diversas classes, cada uma delas terá uma instância diferente:
Imagem mostra que uma instância foi criada para cada chamada do serviço

Oldest comments (0)