Sobes.tech
Senior

Qual é a principal diferença entre Inversão de Dependências e Injeção de Dependências?

sobes.tech IA

Resposta da IA

Inversão de Dependências (princípio da inversão de dependências) é um dos princípios SOLID, que afirma que módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de abstrações. As abstrações não devem depender dos detalhes, os detalhes devem depender das abstrações.

Injeção de Dependências é um padrão ou técnica concreta que implementa o princípio de inversão de dependências. É uma forma de passar dependências (objetos) para uma classe ou função de fora, em vez de criá-las internamente.

Em outras palavras:

  • Inversão de Dependências é um conceito ou princípio de design.
  • Injeção de Dependências é uma forma de implementar esse conceito, quando as dependências são passadas de fora.

Exemplo em Go:

// Abstração
 type Notifier interface {
    Notify(message string)
}

// Implementação concreta
 type EmailNotifier struct {}

func (e EmailNotifier) Notify(message string) {
    fmt.Println("Enviando email com mensagem:", message)
}

// Módulo de alto nível
 type UserService struct {
    notifier Notifier // depende da abstração
}

// Injeção de Dependências via construtor
func NewUserService(n Notifier) *UserService {
    return &UserService{notifier: n}
}

func (s *UserService) RegisterUser(name string) {
    // lógica de registro
    s.notifier.Notify("Usuário registrado: " + name)
}

Aqui, o princípio de inversão de dependências é cumprido através da dependência da interface Notifier, e a injeção de dependências é feita passando uma implementação concreta de EmailNotifier no construtor de UserService.