Sobes.tech
Назад к вопросам
Senior
4

Чем отличается Dependency Injection от Dependency Inversion?

Компании, где спрашивали
purweb

Ответ от нейросети

sobes.tech AI

Dependency Injection (DI) — это паттерн проектирования, при котором зависимости объекта передаются ему извне, а не создаются внутри. Это позволяет легко менять реализации зависимостей и упрощает тестирование.

Dependency Inversion Principle (DIP) — один из принципов SOLID, который гласит, что:

  • Модули высокого уровня не должны зависеть от модулей низкого уровня; оба должны зависеть от абстракций.
  • Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций.

DI — способ реализации DIP. То есть DIP — это принцип архитектуры, а DI — конкретный способ внедрения зависимостей, который помогает следовать этому принципу.

Пример на Go:

// Абстракция
type Notifier interface {
    Notify(message string)
}

// Конкретная реализация
type EmailNotifier struct {}
func (e EmailNotifier) Notify(message string) {
    fmt.Println("Sending email:", message)
}

// Клиент
type UserService struct {
    notifier Notifier
}

// Внедрение зависимости через конструктор (DI)
func NewUserService(n Notifier) *UserService {
    return &UserService{notifier: n}
}

func (u *UserService) SendNotification(msg string) {
    u.notifier.Notify(msg)
}

Здесь DIP соблюдается за счет зависимости от интерфейса Notifier, а DI — за счет передачи конкретной реализации извне.