A injeção de dependência (DI) é um padrão bem conhecido e moderno. A maioria dos engenheiros conhece suas vantagens, como:
- Tornando possível / fácil o isolamento em testes de unidade
- Definindo explicitamente dependências de uma classe
- Facilitar o bom design ( princípio de responsabilidade única (SRP), por exemplo)
- Habilitando a implementação de alternância rapidamente (em
DbLogger
vez deConsoleLogger
por exemplo)
Eu acho que existe um consenso em todo o setor de que o DI é um padrão bom e útil. Não há muitas críticas no momento. As desvantagens mencionadas na comunidade são geralmente menores. Alguns deles:
- Maior número de classes
- Criação de interfaces desnecessárias
Atualmente, discutimos o projeto de arquitetura com meu colega. Ele é bastante conservador, mas de mente aberta. Ele gosta de questionar coisas que considero boas, porque muitas pessoas em TI apenas copiam a tendência mais recente, repetem as vantagens e, em geral, não pensam muito - não analisam muito profundamente.
As coisas que eu gostaria de perguntar são:
- Devemos usar injeção de dependência quando temos apenas uma implementação?
- Deveríamos proibir a criação de novos objetos, exceto os de linguagem / estrutura?
- Injetar uma única implementação é uma péssima idéia (digamos que temos apenas uma implementação para não querermos criar uma interface "vazia") se não planejamos testar uma unidade em particular em uma classe específica?
UserService
classe que é apenas um detentor de lógica. Ele recebe uma conexão com o banco de dados e os testes são executados dentro de uma transação que é revertida. Muitos chamariam isso de má prática, mas descobri que isso funciona muito bem. Não é necessário contorcer seu código apenas para teste e você obtém o erro ao encontrar o poder dos testes de integração.