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.
