Injeção de Dependência e o Life Time Services - Tempo de Serviço ou tempo de vida útil do serviço
- #.NET Core
Injeção de Dependência e o
Life Time Services - Tempo de Serviço ou tempo de vida útil do serviço
Em primeira mão torno a cumprimentar o resilientes e curiosos colegas dos cursos da Digital Innovation One, que não perdem uma oportunidade em aprofundar conhecimentos e também difundi-los, compartilhando os prazeres da aprendizagem constante. Nesse breve artigo, iremos abordar um tema que tem intima importância, uma vez que complementa os assuntos abordados nos bootcamps de .Net: os métodos AddTransient, AddScoped e AddSingleton, suas relações com a injeção de dependência e porque escolher um dentre os três métodos disponíveis.
Já sabemos que Inversão de Controle - IoC, e Princípio da Injeção de Dependência - DIP, são princípios e como a semântica nos leva a deduzir, fornecem as diretrizes para a implementação porém não fornecem os detalhes para isso. A Injeção de Dependência (DI) por sua vez é um padrão que complementa os princípios fornecendo uma solução para a implementação dos mesmos. O IoC Conteiner – contêiner de injeção de dependência, é um framework que utilizado para realizar a injeção de dependência na aplicação.
A plataforma dotNet possui um contêiner nativo definido em Microsoft.Extensions.DependecyInjection, o IServiceProvider. Contudo, existem outros contêineres que podem ser usados na plataforma .Net: Simple Injector, Autofac, Ninject, Spring.Net, Unity, Castle Windsor entre outros. O .NET dá suporte ao padrão de design de software de DI (injeção de dependência), que é uma técnica para aplicar a IoC (inversão de controle) entre classes e suas dependências. A injeção de dependência no .NET é uma parte interna da estrutura, juntamente com a configuração, o registro em log e o padrão de opções.
Quando utilizamos o serviço de um contêiner precisamos definir por quanto tempo o manteremos em memória. Isso quer dizer que iremos definir por quanto tempo o objeto criado no contêiner deve estar disponível em memória. A IServiceColection especifica o contrato para uma coleção de descritores de serviço, sendo que o tempo de vida útil do objeto será definido pelo método de extensão escolhido ao registrarmos o serviço:
- Transiente
São criados a cada solicitação, ou seja cada solicitação irá injetar o serviço em uma classe e será criada uma nova instância do serviço. Seu registro se dá pelo método AddTransiente e sua indicação abrange serviços leves e sem estado, ou quando não fazemos ideia do tempo de vida que necessitaremos.
builder.Services.AddTransiente<Interface,ClassedequeImplementaInterface>()
- Scoped
Indicado para aplicações Web, são criados uma vez por solicitação do cliente – criados com a request, e são descartados após o response. Quando a injeção de dependência é utilizada em muitos lugares em uma request será aproveitada a mesma injeção de dependência sendo utilizada a mesma instância do objeto, fazendo referência à mesma alocação de memória. Seu registro se dá pelo método AddScoped
builder.Services.AddScoped <Interface, ClassedequeImplementaInterface>().
- Singleton
O serviço é criado uma única vez durante a vida útil do aplicativo e usa a mesma instância para todo o aplicativo. Seu registro se dá pelo método AddSingleton:
builder.Services.AddSingleton<Interface, ClassedequeImplementaInterface>().
E assim, compreendemos que na plataforma .Net a escolha de qual método utilizar na implementação do padrão de Dependência de Injeção (AddTransiente, AddScoped ou AddSingleton), estará sujeito à análise do ambiente em que se utilizará, tendo em vista possível comprometimento de memória, bem como a ausência de certeza de por quanto tempo a aplicação necessitará da instância do objeto.
Espero que esse artigo instigue os colegas de jornada de aprendizagem mais do que resolva suas dúvidas, mas que também lance uma luz sobre o tema abordado, sem ter aqui, a pretensão de exauri-lo. Muito obrigado pela leitura.
Referência:
Injeção de dependência no .NET. Disponível em: https://learn.microsoft.com/pt-br/dotnet/core/extensions/dependency-injection. Acessado em 01/10/2022.
NET - Injeção de dependência : tempo de vida dos serviços. MACORATTI, José Carlos. Vídeo aula. Disponível em: https://youtu.be/-ZVrWXsvjUc