Injeção de Dependência não é sobre containers
Quando você ouve falar em Injeção de Dependência (DI), é bem provável que pense logo em um framework ou em um container de injeção cheio de configurações mágicas. Mas aqui é o TheCodeNaked, e a gente vai direto ao ponto: injeção de dependência é um conceito, não um framework.
O que é injetar uma dependência, de verdade?
É simples: é fornecer explicitamente, de fora pra dentro, os objetos de que uma classe precisa para funcionar.
- Se uma classe precisa de um Logger, você passa um Logger para ela.
- Se precisa de um repositório, você passa o repositório.
Isso é injetar. Pode ser via construtor, via propriedade, ou mesmo via método. É só isso.
Mas... e os containers?
Containers são úteis, mas não são obrigatórios. Na verdade, são uma camada a mais que resolve problemas de escala, ciclo de vida e configuração dinâmica.
O problema é quando você aprende o container antes de entender o conceito. Aí tudo vira mágica, e você não entende por que o código funciona (ou para de funcionar).
Injetar é sobre clareza, não sobre facilidade
Muita gente confunde DI com "facilidade de acesso". Mas injetar dependências é, antes de tudo, sobre clareza e controle:
- Clareza sobre o que uma classe realmente depende.
- Controle sobre o ciclo de vida dos objetos.
- Facilidade de testar e substituir dependências.
Se você esconde isso num container mal compreendido, perde exatamente o que devia ganhar.
Exemplo simples, sem container
// Delphi
constructor TMeuServico.Create(ALogger: ILog);
begin
FLogger := ALogger;
end;
// TypeScript
class MeuServico {
constructor(private logger: Logger) {}
}
Nenhum framework. Nenhuma mágica. Apenas injeção.
Quando usar containers?
- Quando você tem muitos objetos com dependências encadeadas.
- Quando precisa trocar implementações dinamicamente.
- Quando quer gerenciar ciclos de vida complexos (escopos, singletons, etc).
Se você entende o que está fazendo, containers ajudam. Mas se você está usando só porque viu num tutorial, talvez esteja criando um monstro.
Conclusão nua e crua
Injeção de dependência é um conceito simples, poderoso, e absolutamente essencial para códigos flexíveis. Mas ele não tem nada a ver, necessariamente, com containers ou frameworks.
Aqui no TheCodeNaked, a gente prefere deixar as coisas nuas:
Se você não consegue explicar o que o container está fazendo por você, talvez você não devesse usá-lo ainda.
Comece simples. Injete com consciência. Depois, se for o caso, traga um container pra te ajudar.
No próximo artigo: "Dependências explícitas são um ato de coragem".