Wstrzykiwanie zależności

Dependency Injection (DI) to podstawowa funkcja w Angular 1.x, która nie zmieniła się w Angular 2. DI to koncepcja programistyczna, wcześniejsza niż Angular. Celem DI jest uproszczenie zarządzania zależnościami w komponentach oprogramowania. Dzięki zmniejszeniu ilości informacji, które komponent musi znać o swoich zależnościach, testowanie go może być łatwiejsze, a kod jest bardziej elastyczny.

Angular 2 poprawia model DI Angulara 1.x poprzez ujednolicenie dwóch systemów wstrzykiwania. Usuwa też inne związane z tym problemy.

Co to jest DI?

Wstrzykiwanie zależności sprawia, że ​​życie programistów jest łatwiejsze, ale co to oznacza
realnie zrobić?

Rozważ następujący kod:

class Hamburger {
  private bun: Bun;
  private patty: Patty;
  private toppings: Toppings;
  constructor() {
    this.bun = new Bun('withSesameSeeds');
    this.patty = new Patty('beef');
    this.toppings = new Toppings(['lettuce', 'pickle', 'tomato']);
  }
}

Powyższy kod jest klasą, która reprezentuje hamburgera. Klasa zakłada, że ​​hamburger składa się z Bun,Patty i Toppings. Klasa jest również odpowiedzialny za tworzenie Bun, Patty i Toppings. To jest zła rzecz. A co, jeśli potrzebny jest wegetariański burger? Najprostszym podejściem może
być:

class VeggieHamburger {
  private bun: Bun;
  private patty: Patty;
  private toppings: Toppings;

  constructor() {
    this.bun = new Bun('withSesameSeeds');
    this.patty = new Patty('tofu');
    this.toppings = new Toppings(['lettuce', 'pickle', 'tomato']);
  }
}

Czyli problem został rozwiązany, prawda? Ale co, jeśli potrzebujemy hamburgera bezglutenowego?
Co jeśli chcemy różnych dodatków ... może czegoś bardziej ogólnego jak:

class Hamburger {
  private bun: Bun;
  private patty: Patty;
  private toppings: Toppings;

  constructor(bunType: string, pattyType: string, toppings: string[]) {
    this.bun = new Bun(bunType);
    this.patty = new Patty(pattyType);
    this.toppings = new Toppings(toppings);
  }
}

W porządku, to jest trochę inne i jest bardziej elastyczne pod pewnymi względami, ale tak jest
wciąż dość wątpliwe. Co by się stało, gdyby konstruktor Patty został zmieniony pozwalając na nowe funkcje? Cała klasa Hamburger musiałaby zostać zaktualizowana.
W rzeczywistości za każdym razem, gdyby którykolwiek z tych konstruktorów używanych w konstruktorze Hamburger został zmieniony, Hamburger również musiałby zostać zmieniony.

Co się dzieje podczas testowania? Jak mogą być Bun,Patty i Toppings skutecznie przeglądnięte?Biorąc pod uwagę te obawy, klasę można przepisać jako:

class Hamburger {
  private bun: Bun;
  private patty: Patty;
  private toppings: Toppings;

  constructor(bun: Bun, patty: Patty, toppings: Toppings) {
    this.bun = bun;
    this.patty = patty;
    this.toppings = toppings;
  }
}

Teraz gdy instancja Hamburger jest tworzona, nie musi nic wiedzieć o Bun,Patty lub Toppings. Konstrukcja tych elementów została wyprowadzona z tej klasy. Ten wzór jest tak powszechny, że TypeScript pozwala na napisanie skrótowo:

class Hamburger {
  constructor(private bun: Bun, private patty: Patty,
    private toppings: Toppings) {}
}

Klasa Hamburger jest teraz prostsza i łatwiejsza do przetestowania. Ten model dostarczane do Hamburger - zależności jest podstawą "wstrzykiwania zależności".

Jednak nadal istnieje problem. W jaki sposób można utworzyć i zarządzać instancjami Bun, Patty iToppingami?

To tam wstrzykiwanie zależności jako framework (DI Framework) może przynieść korzyści programistom;

Zobacz też: https://www.p-programowanie.pl/kurs-angular/wstrzykiwanie-zaleznosci/