dotnet Core – AddTransient, AddScoped e AddSingleton na prática

Você como dev dotnet com certeza trabalha com Injeção de Dependência e já ouviu falar dos métodos AddScoped, AddTransient e AddSingleton da interface IServiceCollection do .NET Core. Esses métodos são usados para registrar serviços que serão usados em toda a aplicação, mas existem diferenças importantes entre eles. Neste artigo, vamos explicar essas diferenças para que você possa escolher a melhor opção para o seu projeto.

Antes de ir para o código vamos para a definição (que é fácil de encontrar em outros lugares).

AddScoped

O método AddScoped é usado para registrar um serviço que deve ser criado uma vez por solicitação (ou seja, uma vez por escopo). O escopo pode ser uma solicitação HTTP ou uma transação de banco de dados, por exemplo. Se o mesmo serviço for solicitado novamente durante a mesma solicitação ou transação, a mesma instância será retornada. No final do escopo, o serviço será descartado.

AddTransient

O método AddTransient é usado para registrar serviços que serão criados cada vez que forem solicitados. Isso significa que um novo serviço será criado sempre que um componente precisar dele. Esse método é útil para serviços leves e sem estado que não precisam ser mantidos na memória por muito tempo.

AddSingleton

O método AddSingleton é usado para registrar serviços que serão criados apenas uma vez durante toda a vida útil da aplicação. Isso significa que o mesmo serviço será usado por todas as solicitações HTTP. Esse método é útil para serviços que são caros de serem criados e mantidos em memória, como um contexto de banco de dados ou uma conexão com um serviço externo.

Em resumo, o método AddScoped é usado para serviços que precisam ser criados uma vez por solicitação, o método AddTransient é usado para serviços leves e sem estado que são criados cada vez que são solicitados e o método AddSingleton é usado para serviços que devem ser mantidos em memória durante toda a vida útil da aplicação.

Coloquei em meu github um projeto onde fica fácil visualizar o comportamento de cada um destes métodos debugando o código.

O projeto implementa os 3 tipos de escopos gerando um novo GUID no construtor da classe. Você pode observar que ao passar pelo método AddTransient um novo GUID é gerado, diferente do AddScoped e AddSingleton.

Há duas rotas no projeto get1 e get2 para exemplificar. A rota get1 apenas chama cada uma das implementações que utilizam estes métodos diretamente, já o get2 faz uma chamada as implementações através de outros métodos. É como se fosse uma rota que chama uma camada de serviço que chama o repositório (neste caso temos várias injeções de dependencia ocorrendo).

Link para o projeto: https://github.com/tiagocrizanto/dotnet-depency-injection