Utilizando injeção de dependência no ASP .NET Core



...

Falaaaaaaaa desenvolvedor, tudo bem? Estou ótimo, obrigado por perguntar, no artigo de hoje, vou abordar um tema que todo desenvolvedor deveria saber, ainda mais desenvolvedores ASP .NET Core, a injeção de dependência, uma prática que facilita você gerenciar as dependências que você precisa durante o código.

 

Para apresentar esse tema, estarei demonstrando utilizando ASP .NET Core, utilizando o container nativo para realizar a injeção de dependência, porém, o exemplo que vou demonstrar funciona em qualquer tipo de projeto .NET Core (Console, Desktop, Mobile e etc).

 

 

O que é DI — Injeção de dependência

 

Antes de implementar qualquer tipo de código, vamos entender como a injeção de dependência funciona de uma forma fácil e simples, como a maioria das pessoas que leem meus artigos sabe, gosto de explicar os conceitos trazendo exemplos da vida real.

Então, imagine que exista uma empresa com 2 motoristas, João e José (sim nomes bem comuns), sendo que ambos são motoristas de uma transportadora de cargas, João, tem um carro próprio para fazer as entregas, enquanto José, trabalha com o automóvel que a empresa disponibiliza diariamente.

Imagine também que essa empresa transporta 3 tipos de cargas, leve, média e pesada, sendo que para cargas leves o recomendado é uma moto, para cargas médias o recomendado um carro e para cargas pesadas o recomendado é um caminhão.

Agora imagine que durante o dia José, tenha que fazer 2 entregas de cada tipo de carga, para isso quem fornece o automóvel para ele é a empresa.

Da mesma forma, João só pode realizar 2 entregas médias afinal ele trabalha somente com seu carro.

Então qual está mais apto a prestar trabalhos para essa transportadora? Claramente que é o José, afinal quem fornece o automóvel adequado para entrega a ele é a empresa.

Lucas o que isso tem a ver com injeção de dependência e código? Ora, eu respondo jovem desenvolvedor, a empresa (container) deu o automóvel adequado (injetou a dependência necessária) para José, poder trabalhar (para quem necessita dessa dependência poder trabalhar).

Então, utilizando injeção de dependência eu evito criar muitas instâncias em diversas partes do código e utilizo o container para injetar as instâncias necessárias onde eu necessito.

Ao utilizar injeção de dependência você deixa o código mais resiliente e eficiente, centralizando todo o gerenciamento de instâncias do código no container além disso faz parte de um dos princípios do SOLID: O DIP — Dependency Inversion Principle.

 

 

Botando a mão na massa!

 

Agora que já entendemos o que é e como funciona a injeção de dependência, vamos aplicar isso utilizando ASP .NET Core, mas lembre-se DI é um conceito global, pode e deve ser aplicado em qualquer linguagem orientada a objetos sendo assim considerada uma boa prática de programação.

Para o exemplo prático, vou usar o mesmo conceito da empresa de entregas e dos motoristas.

Tenho aqui comigo criado um projeto ASP .NET Core 3.0, porém poderia ser qualquer versão, criei uma pasta chamada Interfaces e outra chamada Classes para podermos colocar nossas abstrações e objetos. A estrutura ficará assim:

 

As interfaces servem para abstrair a instância do nosso objeto, tornando o código bem mais resiliente, no exemplo também fiz questão de seguir o princípio ISP — Interface Segregation Principle, que em linhas gerais diz: É melhor termos várias interfaces especializadas do que uma interface genérica para vários objetos.

O código das interfaces ficou bem simples:

 

Cada classe herdará sua interface especializada:

 

Perceba que cada classe herda sua interface especializada, que herda sua interface especializada e cada interface especializada herda um interface genérica contendo um método que é comum entre todas as outras classes, cada classe recebe em seu construtor diferentes parâmetros e só realiza a entrega se for o tipo de entrega adequada para o automóvel.

Ok Lucas, entendi a questão das interfaces, mas onde que entra a injeção de dependência nisso??? Calmaaaaaa, antes de registrar nossas dependências vamos criar nosso controller para a gente receber as dependências e ver os resultados de tudo isso. Crie um controller chamado DIController.cs com o seguinte método:

 

Perceba que, no construtor do controle, nós recebemos 3 dependências: IMotoService, ICarroService e ICaminhaoService, e é por elas que chamamos os métodos necessários, ta bom Lucas, mas QUEM PASSA PARA A GENTE ESSAS AS INSTÂNCIAS DESSAS INTERFACES??

É aí que entra nosso container de injeção de dependência!!!!!

Por fim, precisamos registrar nossas dependências e para isso precisamos do nosso container de injeção, que nativamente já vem instalado no nosso projeto, que é o Microsoft.Extensions.DependencyInjection

OBS: Existem muitos outros containers de injeção de dependência, esse é o da Microsoft!!!

Antes de registrarmos as dependências, preciso falar sobre os 3 tipos que nosso container nos oferece, são eles:

Transient: É gerado uma nova a instância a cada classe que necessita da dependência inserida.

Ex: 3 classes necessitam da mesma dependência, são geradas 3 instâncias para as 3 classes

Scoped: É gerado uma nova instância a cada requisição e é usada em cada lugar que necessita da dependência inserida.

Ex: 3 classes necessitam da mesma dependência, é gerado uma instância e usada nas 3 classes

Singleton: É gerado uma nova instância a primeira vez que for requisitada e é usada até o fim da execução do programa

Ex: 3 classes necessitam da mesma dependência em 3 requisições diferentes, é gerado somente 1 instância e ela é usada em todas os lugares que necessitam e em todas as requisições

Agora que já sabemos os tipos, vamos registrar elas.

Vá até a classe Startup.cs e no método ConfigureServices registre as seguintes dependências:

 

Entenda, a cada vez que você precisar da dependência IMotoService por exemplo, o próprio container já irá gerar a instância e injetar essa dependência automaticamente no construtor, basta apenas ele estar configurado.

Por isso o nome injeção de dependência, a cada vez que você precisar o seu container vai injetar no seu construtor a dependência necessária.

OBS: Existem outras formas de DI, como Property Injection e Service Locator, mas não são recomendados seu uso pois são considerados um anti-pattern e são bem “chatinhas” para poder testar.

Ahh, antes que eu esqueça, vamos executar nossa aplicação e ver seu resultado na tela:

 

 

Conclusão

 

No artigo de hoje vimos o que é e como aplicar a injeção de dependência em projetos ASP .NET Core, também entendemos a importância de utilizar esse padrão de projeto e como ele pode deixar o seu código mais resiliente e mais fácil e evitar o alto acoplamento de código. Espero que tenha ficado bem claro todos os conceitos e práticas abordados nesse artigo.

Enfim, até logo e bons estudos!!!

Baixe os comandos apresentados clicando aqui.

Caso precise entrar em contato, me mande uma mensagem aqui.