Container de Injeção de Dependência para Go (Golang) — wire, dig, fx

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Container de Injeção de Dependência para Go (Golang): Wire, Dig e Fx



No mundo do desenvolvimento em Go (Golang), Dependency Injection (DI, injeção de dependências) não é apenas um padrão da moda, mas uma ferramenta poderosa para criar código limpo, testável e sustentável. Ao contrário de muitas linguagens orientadas a objetos, Go não possui suporte nativo a containers DI. No entanto, a comunidade criou várias bibliotecas elegantes que resolvem esse problema. No PythonLib, analisaremos as três ferramentas mais populares: Wire do Google, Dig da Uber e Fx (também da Uber).



Por que usar DI em Go?

Em uma aplicação Go típica, você frequentemente escreve a inicialização manual de dependências:



func main() {    db := database.NewConnection()    repo := repository.NewUserRepo(db)    service := service.NewUserService(repo)    handler := handler.NewUserHandler(service)    // ... e assim por diante}


Isso funciona para projetos pequenos, mas quando a aplicação cresce, surgem problemas:

  • Acoplamento rígido: Alterar um construtor quebra todas as cadeias de inicialização.
  • Duplicação de código: Nos testes, é necessário reescrever todas as conexões manuais.
  • Dificuldade de refatoração: Qualquer alteração nas dependências exige percorrer manualmente todos os locais de criação de objetos.


O container DI automatiza esse processo, assumindo o gerenciamento do ciclo de vida dos objetos e suas conexões.



1. Wire do Google — geração de código sem reflexão

Wire não é apenas uma biblioteca, mas uma ferramenta de geração de código. Ele analisa seus construtores e gera o código de inicialização em tempo de compilação. Essa é a principal diferença: Wire não usa reflect (reflexão), tornando-o ideal para aplicações de alta carga onde o desempenho é crucial.



Instalação e exemplo

go install github.com/google/wire/cmd/wire@latest


Exemplo de estrutura (arquivo wire.go):



// +build wireinject

package main

import ( "github.com/google/wire")

func InitializeUserHandler() (*UserHandler, error) { wire.Build( NewDatabase, NewUserRepository, NewUserService, NewUserHandler, ) return nil, nil}


Após executar wire, é gerado o arquivo wire_gen.go com o código de inicialização pronto. Você obtém:

  • Segurança de tipos: Erros são detectados em tempo de compilação.
  • Custo zero em runtime: Sem reflexão, sem atrasos.
  • Transparência: O código gerado é fácil de ler e depurar.


2. Dig da Uber — container dinâmico com reflexão

Dig é um container DI completo que opera em runtime. Ele usa reflexão para analisar tipos e montar automaticamente o grafo de dependências. Dig é ideal para prototipação e aplicações onde a flexibilidade é mais importante que o desempenho absoluto.



Exemplo de uso do Dig

package main

import ( "go.uber.org/dig")

func main() { container := dig.New()

// Fornecemos os construtores container.Provide(NewDatabase) container.Provide(NewUserRepository) container.Provide(NewUserService) container.Provide(NewUserHandler)

// Executamos uma função que usa as dependências container.Invoke(func(handler *UserHandler) { handler.HandleRequest() })}


Principais recursos do Dig:

  • Resolução automática de dependências: O container encontra os tipos necessários por conta própria.
  • Suporte a instâncias nomeadas: É possível registrar múltiplas implementações de uma mesma interface.
  • Decoradores

Recommendations