Skip to content

Injeção de dependência, Acoplamento e ASP.NET Core

Olá, no artigo de hoje eu vou falar sobre o que é o padrão Injeção de Dependência e como isso ajuda a diminuir o acoplamento em nosso projeto. Claro que tudo isso funcionando no ASP.NET Core.

A injeção de dependência, ou DI de Dependency Injection, é algo muito comentado, muita gente acha que fazer injeção de dependência é apenas algo para automaticamente ser adicionado em nossos controles para o uso da mesma. Mas já lhe informo que esse processo é mais questão conceitual do que simplesmente um facilitador. 

Antes de explicar sobre DI, precisamos saber o que é acoplamento no mundo de software. Como o próprio nome diz, acoplamento quer dizer junção, ligação ou conexão entre duas classes. Vou dar um exemplo melhor, imagina que temos a classe A que tem uma ligação (acoplamento) com a classe B. Veja o exemplo abaixo. 

Perceba que até aí está tudo normal, pois não existe software sem acoplamento, pelo menos uma classe em sua aplicação terá que se relacionar com outra classe, a não ser que você construa uma única classe para o sistema inteiro, mas aí começamos a criar outro problema. 

O problema de acoplamento começa quando você precisa instanciar a classe B sendo que em teoria a classe A não tem essa responsabilidade. Por exemplo 

Nesse caso, você está dando uma responsabilidade a mais a classe A e o “poder” de saber coisas de mais sobre a classe B, parece besteira isso, mas esse “poder” prejudica muito o desenvolvimento de software, você passa a ter várias classes poderosas ao longo do sistema e o caos se instaura nesse momento. Isso parece inofensivo, mas já vi muita gente precisando instanciar a classe A por que precisava da classe B, só por que ela sabe como fazer isso. No fundo não precisava da classe A, mas como naquele momento era mais fácil fazer isso, então, por que não?! 

Que tal fazer o certo? Olha o exemplo 

Nesse caso perceba que a classe A ficou com acoplamento menor, ela não sabe como a classe B é instanciada e foda-se quem sabe fazer isso, a classe A somente quer usar a classe B e ponto final. Você consegue ver como eu resolvi o problema de acoplamento? Sim exato, através da injeção do objeto requerido. 

Beleza, massa, show de boa! Mas como agora eu passo a classe B para a classe A em tempo de execução? 

Agora de fato o assunto desse artigo se inicia, vamos utilizar o DI do ASP.NET Core. 

Nos frameworks anteriores da Microsoft, como o .Net Framework, você deveria manualmente configurar algum container de dependência. Existem alguns bons no mercado, como Ninject, Castle e outros. 

Calma, você acabou de falar um outro termo. O que é container? Vou resumir, container é o objeto responsável por ter todas as configurações necessárias para instanciar as classes do seu projeto quando necessária. Então não confunda o padrão injeção de dependência com um container. 

Bom, continuando, com o novo ASP.NET Core, a Microsoft resolveu implementar um novo container que por default já vem configurado para o seu projeto. 

Normalmente toda configuração deve ser feita na classe Startup, nesta classe você irá configurar a injeção dos seus serviços e habilitação dos middlewares necessários para sua aplicação. Por esse motivo temos dois métodos, “ConfigureServices” e “Configure”. Vamos se atentar apenas ao método ConfigureServices que é onde vamos configurar o container. 

A partir de agora, a classe de repositório, ProductRepository, poderá ser injetada na controller, sem se importar em como ela foi criada. 

Normalmente em um container existe algo chamado service lifetime, ou seja, ciclo de vida do serviço. Isso ocorre quando um componente solicita outro componente através do DI, assim você poderá informar como quer que esse componente seja instanciado. Será compartilhado? Criado sozinho? Por isso existe esses caboclos abaixo. 

Singled significa que somente uma instancia será criada em toda a vida do projeto. Pense na vida do projeto quando você inicia a aplicação no servidor. 

Scoped significa que somente uma instancia será criada em toda a vida da requisição. Pense em requisição quando o cliente submete alguma informação e a aplicação responde.  

Transient significa que o componente é criado a todo momento, nunca é compartilhado. 

Conclusão 

Não utilize DI apenas por moda, saiba o significado e sua importância. Critique ou elogie, mas saiba o motivo pelo qual é utilizado. Agora você sabe que no ASP.NET Core existe um default e que facilita em muito no desenvolvimento para ter um acoplamento menor. 

Você gostou desse artigo? Gostaria de saber mais sobre ASP.NET Core? Eu desenvolvi um curso na Udemy, preço camarada e com mais de 13h de curso. Acesse https://www.udemy.com/aspnet-core-aprendendo-do-zero-ao-avancado/

Published in.Net Core

2 Comments

  1. Vinicius Lopes de Almeida Vinicius Lopes de Almeida

    Muito Bom, sucinto e eficiente!! Parabéns!!

  2. Kalleber Kalleber

    Ola boa noite professor,
    Gostei bastante da introdução do curso ASP.NET Core: Aprendendo do zero ao avançado (v 1.1 e 2.0), porém gostaria de obter um cupom udemy para fazê-lo, talvez seja um pedido desapropriado, mais não custa pedi, se possível free, minhas condições não estão boas para adquiri-lo.
    não encontrei seu contato em outo lugar.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *