Como implementar Injeção de Dependências em Go manualmente?

Como implementar Injeção de Dependências em Go manualmente?

# go# cleancode# programming# backend
Como implementar Injeção de Dependências em Go manualmente?Ortiz de Arcanjo António David

A linguagem Go permite controlar manualmente as dependências com mais facilidade. Cada item da sua...

A linguagem Go permite controlar manualmente as dependências com mais facilidade.
Cada item da sua aplicação pode ser instanciado onde o desenvolvedor desejar. Go nos dá essa liberdade.

Mas, com o crescimento do projeto, é importante arranjar uma estratégia para carregar as dependências, porque elas podem afetar positiva ou negativamente a aplicação.
Essa liberdade do Go pode dar margem para vários erros de dependências. Para projetos pequenos, faz sentido, mas para grandes projectos pode ser difícil de manter.

Cenário comum: main inflado

  • Instanciar DB, cache, configs no main
  • Instanciar repos, services
  • Criação e inicialização dos componentes Isso Faz sentido para projetos com poucos componentes, não reprsenta grandes riscos.

Solução: injeção via containers

  • Criar container de infraestrutura: DB, Cache, Logger, Mensageria e outros.
  • Container de serviços: regras de negócio
  • Container de repositórios: interação com a base de dados No Main, só precisamos carregar os containers. o Main se torna o maestro da aplicação.

Vantagens

  • Criação dos objetos 1 vez apenas
  • Organização dos componentes
  • Separação de responsabilidades
  • Performance melhorada

Por que fazer isso manualmente?

Embora existam bibliotecas como Google Wire ou Uber FX, fazer a gestão manual com containers traz:

  • Performance: Sem uso de reflection em tempo de execução.
  • Transparência: Você vê exatamente o que está sendo injetado e onde.
  • Singleton por Design: Objetos pesados (como pools de DB) são criados apenas uma vez.
  • Testabilidade: É fácil substituir um repositório real por um mock nos seus testes.

Código-fonte

Como tens organizado as dependências nos teus projetos? Abordagem manual ou usas bibliotecas?