Afinal o que é “Injeção de Dependência” (exemplos com C#)

Marcio Nizzola
4 min readJun 5, 2020

--

Afinal o que é “Injeção de Dependência” ? exemplos no C#

Quando desenvolvemos software e trabalhamos com projetos complexos, se começarmos a criar a aplicação sem uma padronização adequada, em breve teremos um emaranhado de códigos que estão largamente interligados e que dificilmente conseguiremos alterar um pedaço da aplicação sem quebrar outra, quem nunca se deparou com esse dilema na vida ? É como um cobertor curto, onde você ajusta de um lado e estraga do outro.

Para evitar esse dilema, um dos conceitos amplamente utilizados e que é essencial hoje na vida de um desenvolvedor é a “Injeção de Dependência” (Dependency Injection), nada mais é do que fazer com que a interação entre objetos seja o mais fina e limpa possível.

Bem, de acordo com Mark Seemann, autor do maravilhoso livro “Dependency Injection on .Net”, a Injeção de Dependência é “um conjunto de princípios e padrões de design de software que nos permitem desenvolver código pouco acoplado”. Essa é uma boa definição, mas um pouco técnica demais.

Uma dependência é qualquer coisa que uma determinada classe precise para fazer seu trabalho, como campos, métodos, outras classes, etc.

Acoplamento é a noção de que uma coisa depende da outra e estão estritamente ligadas. Você não pode compilar a Classe A sem a definição completa da Classe B presente. B está permanentemente preso a A. O acoplamento apertado é ruim — cria código inflexível. Pense em como seria difícil se deslocar se você estivesse algemado a outra pessoa. É assim que uma classe se sente quando você cria dependências codificadas.

O que você deseja é manter o acoplamento entre suas classes e módulos o mais “flexível” possível. Se você tem uma classe que precisa de um nome de cliente, passe apenas o nome do cliente. Não passe o cliente inteiro. E como veremos, se sua classe precisar de outra classe, passe em uma abstração — uma interface, geralmente dessa classe. Uma interface é como uma nuvem de fumaça — há algo lá, mas você realmente não pode se agarrar a ela.

O segredo do funcionamento da injeção de dependência, está nas Interfaces, ao invés de instanciarmos uma classe dentro de outra, iremos instanciar um objeto através da sua interface ! Para quem não sabe o que é, o meu artigo anterior explica o que é uma interface.

No exemplo abaixo, vemos um modelo clássico de uma interface, que servirá para a injeção de dependência em um repositório de banco de dados, definindo todos os métodos.

Depois temos outra interface que é baseada nesta primeira, que serve para definir tudo que um repositório de cidade faz, unindo as rotinas básicas de um banco de dados, e as rotinas específicas de uma cidade.

Estas interfaces não precisam ter os métodos definidos para podermos utilizá-la numa classe de serviço

Benefícios da Injeção de dependência:

  • uma interface pode expor apenas alguns métodos dependendo da camada de negócio.
  • usar uma interface permite que injetemos classes diferentes que são compatíveis com a mesma interface, e assim facilitar a implementação de lógicas diferentes e também a testabilidade de um software.
  • quem vai consumir um método de uma classe, não precisa conhecê-lo, só precisa conhecer a sua assinatura através da interface (muitas vezes ele nem foi construído ainda, mas a interface já nos diz como ele será).
  • pode-se no caso de um repositório de banco de dados ter uma implementação específica para testes, fazendo um “Mock” do banco de dados (banco fake apenas para testes) com comportamento análogo ao banco real.
  • podemos ter uma única instância de uma classe dentro da aplicação sendo injetada em locais diversos consumindo menos memória.

Num próximo artigo, vou demonstrar como fazer injeção de dependência em um console application com .Net Core. (clique para acessar)

Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.