Injeção de Dependência

Eduardo Lanfredi
4 min readAug 29, 2017

--

O que é Injeção de Dependência?

Injeção de Dependência é um é um padrão de projeto usado para evitar o alto nível de acoplamento de código dentro de uma aplicação. Sistemas com baixo acoplamento de código são melhores pelos seguintes motivos: Aumento na facilidade de manutenção/implementação de novas funcionalidades e também habilita a utilização de mocks para realizar unit testes.

Na prática

Veja o caso abaixo. A classe Order irá criar uma nova instância de OrderItem toda vez que for inicializada.

A primeira vista, a classe Order parece normal (e é, dependendo do nível de acoplamento que você deseja). Mas você terá alguns problemas quando precisar testar esse código. A classe Order contém uma instância de OrderItem no seu escopo. Além do que, toda alteração feita no construtor de OrderItem afetará diretamente a classe Order.

Injeção de Dependência e Inversão de Controle

Injeção de dependência é uma das duas maneiras de implementar a inversão de controle. Inversão de controle é um termo mais amplo, onde a responsabilidade de informar a implementação a ser utilizada deixa de ser da classe, e passa a ser do consumidor da classe. A segunda maneira de implementar a IoC seria com Service Locator. Toda implementação de inversão de controle nos ajuda a seguir o primeiro e o último dos cincos princípios SOLID.

• S — Single-responsiblity principle
• O — Open-closed principle
• L — Liskov substitution principle
• I — Interface segregation principle
• D — Dependency Inversion Principle

O padrão Injeção de dependência diz: Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.
Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.

Vamos implementar Injeção de Dependência na classe Order. O código deve ficar mais ou menos assim:

Não fizemos nada além de remover a instância da classe OrderItem do escopo e adicioná-la ao construtor. Dessa maneira, enviamos a responsabilidade para quem instância a classe Order. Esse tipo de injeção é chamada de Contructor Injection. São três no total:

• Injeção por Construtor
• Injeção por Interface
• Injeção por propriedades(get/set)

Injeção por Construtor

Acontece quando a classe a ser utilizada recebe por construtor uma instância de classe que ela mesmo irá utilizar. No nosso caso, precisamos utilizar métodos de OrderItem dentro de Order, para isso, a instância de OrderItem é enviada através do construtor de Order.

Injeção por Interface

Ao invés de receber o construtor por parâmetro, agora a classe deve receber uma abstração da implementação que ela irá utilizar, através de uma interface. O grande benefício é que quem define qual implementação da abstração a ser utilizada, é quem está utilizando a classe principal.

Nesse caso, podemos criar duas implementações diferentes de OrderItemInterface. Quando a classe Order é instânciada, passamos por parâmetro a implementação desejada de OrderItem.

Injeção por propriedades(get/set)

Ocorre quando se tem a classe a ser injetada exposta como uma propriedade.

Frameworks auxiliares

Existem muitos frameworks que podem ajudar na hora de implementar o padrão Dependecy Injection com .NET. Nesse artigo, Scott Hanselman mostra diversos containers que podem ser utilizados para a implementação de Injeção de dependência. Não esqueça que .NET Core vem com seu próprio container de injeção de dependência.

Por fim

Hoje vimos como evitar alto acoplamento de código e tornar o código mais testável através da implementação de Dependency Injection. É possível encontrar o código fonte aqui: https://git.io/vQFMp

--

--