O Que é Dependency Injection? Fornecendo Colaboradores de Fora
Dependency injection (DI) fornece a um componente suas dependências de fora, em vez de fazer o componente criá-las por conta própria.
Quando uma classe constrói seus próprios colaboradores, um client de banco de dados, um serviço HTTP, ela fica soldada a essas escolhas concretas e difícil de testar. Dependency injection inverte isso: as dependências são passadas para dentro. O componente depende de uma interface, e o caller decide qual implementação fornecer. O maior benefício aparece em quão limpo você consegue testar o resultado.
Inversão de controle
Em vez de um componente sair para construir o que precisa, os objetos necessários são entregues a ele, via o construtor, um setter ou um framework. O componente declara do que depende; algo mais decide o que fornecer.
Por que ajuda
- Testabilidade: injetar um fake ou mock no lugar da dependência real.
- Flexibilidade: trocar implementações sem mudar o consumer.
- Dependências claras: um componente declara o que precisa de antemão.
- Acoplamento mais frouxo a classes concretas.
O benefício nos testes
DI é o que torna um componente unit-testável sem seus colaboradores reais. Você injeta um test double para o banco de dados ou serviço externo, então o teste roda rápido, deterministicamente e em isolamento, sem rede, sem banco de dados real, sem estado compartilhado.
CI mais rápido e confiável
Testes que injetam fakes para dependências lentas ou flaky rodam rápido e não quebram porque um serviço externo está fora do ar. Isso mantém a suíte de CI rápida e estável, reservando testes de integração mais lentos para o wiring real.
Onde traçar a linha
DI é uma ferramenta, não um objetivo. Sobre-injetar dependências triviais adiciona indireção que obscurece o código. Injete as coisas que você quer trocar ou fingir, network clients, serviços externos, e deixe a construção simples cuidar do resto.
Suítes de unit rápidas em runners quentes
Unit tests guiados por DI são rápidos justamente porque evitam dependências reais. Runners quentes (como o Latchkey) mantêm a suíte inteira rápida de ponta a ponta para que a velocidade que a DI te dá não seja perdida na inicialização do runner.
Principais conclusões
- Dependency injection fornece a um componente suas dependências em vez de construí-las.
- Ela torna componentes testáveis em isolamento, injetando fakes no lugar de colaboradores reais.
- Injete o que você quer trocar ou fingir; não sobre-injete dependências triviais.