Sobes.tech
Senior

Koja je ključna razlika između Dependency Inversion i Dependency Injection?

sobes.tech АИ

Одговор од АИ

Inverzija zavisnosti (princip inverzije zavisnosti) je jedan od SOLID principa, koji kaže da moduli visokog nivoa ne bi trebalo da zavise od modula niskog nivoa, oba treba da zavise od apstrakcija. Apstrakcije ne bi trebalo da zavise od detalja, detalji treba da zavise od apstrakcija.

Injektovanje zavisnosti je konkretan obrazac ili tehnika koja implementira princip inverzije zavisnosti. To je način prenosa zavisnosti (objekata) u klasu ili funkciju spolja, umesto da ih kreirate unutar.

Drugim rečima:

  • Inverzija zavisnosti je koncept ili princip dizajna.
  • Injektovanje zavisnosti je način implementacije ovog koncepta, kada se zavisnosti prenose spolja.

Primer u Go:

// Apstrakcija
 type Notifier interface {
    Notify(message string)
}

// Konkretna implementacija
 type EmailNotifier struct {}

func (e EmailNotifier) Notify(message string) {
    fmt.Println("Slanje emaila sa porukom:", message)
}

// Modul visokog nivoa
 type UserService struct {
    notifier Notifier // zavisi od apstrakcije
}

// Injektovanje zavisnosti putem konstruktora
func NewUserService(n Notifier) *UserService {
    return &UserService{notifier: n}
}

func (s *UserService) RegisterUser(name string) {
    // logika registracije
    s.notifier.Notify("Korisnik registrovan: " + name)
}

Ovde, princip inverzije zavisnosti se poštuje putem zavisnosti od interfejsa Notifier, a injektovanje zavisnosti se vrši prosleđivanjem konkretne implementacije EmailNotifier u konstruktor UserService.