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

Uma das perguntas que mais ouço em entrevistas é: o que é Injeção de Dependência? Normalmente esta pergunta vem acompanhada de outras duas: (1) quais suas vantagens e desvantagens? e (2) que frameworks você conhece que implementam este pattern (padrão)?

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

Injeção de Dependência (DI, do termo em inglês dependency injection) é um padrão de desenvolvimento que implementa Inversão de Controle (IoC – inversion of control – um dos cinco princípios SOLID) para resolver dependências entre classes, mantendo as classes com baixo nível de acomplamento. Neste tipo de solução, ao invés de instanciar objetos diretamente ou usar referências estáticas, os objetos são fornecidos (“injetados”) por um framework sempre que necessário, normalmente através do construtor ou de propriedades.

Acoplamento, neste contexto, é a conexão/dependência/interação entre classes. Quanto maior for o acoplamento, maior a coesão e mais difícil e trabalhosa é a manutenção do sistema.

Pode-se implementar de três maneiras diferentes, através de:

  1. Constructor: modo em que implementa-se DI a na definição dos construtores das classes;
  2. Getter e Setter: implementa DI através dos métodos get e set das propriedades;
  3. Service Locator: usa-se classes que servem como “localizadoras” de objetos que são instanciados na classe.

Injeção de Depêndencia: vantagens e desvantagens

As principais vantagens são:

  • Se não elimina, ou ao menos reduz significativamente a dependência entre as classes;
  • Aumenta a reusabilidade de componentes – como eles não sabem como as classes das quais dependem são implementadas, tornam-se mais reutilizáveis;
  • Reduz a complexidade do módulo (classe);
  • Facilita a execução de testes unitários (unit tests), uma vez que este tipo de padrão utiliza interfaces, que podem ser facilmente “mockadas”; e
  • Tona o código mais legíveis e, por consequência, facilita a manutenção projeto;

Dentre as desvantagens, pode-se citar:

  • Aumenta a complexidade do projeto e pode requer mais esforço de desenvolvimento inicial;
  • Faz com que os clientes exigem detalhes de configuração fornecidos pelo código de construção;
  • Torna o debug mais difícil, pois torna o código mais difícil de rastrear uma vez que separa o comportamento da construção da classe que é injetada.

Frameworks para Injeção de Depêndencia

Além do .NET, há outros frameworks que implementam injeção de depêndencia, os mais conhecidos são:

  • Unity (unitycontainer.org): projeto criado e desenvolvido pela Microsoft e entregue à comunidade em 2015. Suporta .NET Framework 4.0+, .NET Core e .NET Standard 1.0 e 2.0, o código pode ser baixado em github.com/unitycontainer/unity. Número de download no NuGet: 44 milhões.
  • Autofac (autofac.org): projeto open source com código disponível em github.com/autofac/Autofac. Suporta .NET Core, ASP.NET Core, .NET Standard 2.1 e .NET Framework 4.5.1+. Número de download no NuGet: 38,8 milhões.
  • Ninject (ninject.org): sua versão mais atual (3.3.4) suporta .NET Framework 4.5 e .NET Standard 2.0. O código está disponível em github.com/ninject/ninject. Número de download no NuGet: 23,4 milhões.
  • Castle Windsor (castleproject.org/projects/windsor): mais um projeto open source hospedado no GitHub github.com/castleproject/Windsor. Sua versão mais atual (5.1.1) suporta .NET Framework 4.5 e .NET Standard 1.6. Número de download no NuGet: 20,4 milhões.