Czym jest dependency injection (DI)?

W jednym z poprzednich postów pisałem o tym jak korzystać w Aurelii z dependency injection wraz z dziedziczeniem.

Dziś mnie natchnęło, że warto byłoby powiedzieć w ogóle czym jest dependency injection, dla osób które nie znają tego świetnego rozwiązania!

Dependency injection (wstrzykiwanie zależności/DI) jest to wzorzec projektowy, który wywodzi się z innego, a mianowicie z Invesion Of Control (odwrócenia starowania).

Odwrócenie sterowania polega na oddaniu “władzy” nad wywoływaniem kodu napisanego przez programistę do (najczęściej) frameworku.

Najprostszą implementacją DI jest definiowanie wszystkich zależności ręcznie, a następnie przekazywanie ich do konstruktora naszej nowej klasy. Niestety w tym przypadku na głownie nadal zostaje nam pamiętanie o np. zależnościach zależności :)

Z pomocą przychodzą gotowe implementacje z różnych frameworków np. AngluarJS czy też Aurelii.

W Aurelii wygląda to tak:

import {inject} from 'aurelia-framework';  
import {HttpClient} from 'aurelia-fetch-client';

@inject(HttpClient)
export class Examle {
constructor(httpClient) {
this.client = httpClient;
}
}

Na początku importujemy potrzebną nam klasę i dekorator @inject, a następnie za jego pomocą wstrzykujemy zależność do naszej nowej klasy Example. Nie musimy się zastanawiać od czego zależy klasa HttpClient, jesteśmy tez pewni, że nasza nowa klasa nie stworzy swoich instancji klasy HttpClient tylko będzie korzystać z już istniejącej w stworzonym przez framework zwanym “DI container”, lub w przypadku jego braku stworzy nową instancję (DI container defaultowo przyjmuje, że każdą zależność jest to singleton). Obiekt jest następnie przekazywany do konstruktora gdzie możemy przypisać go do property naszej klasy, i korzystać do woli :)

DI jest metodą pozwalająca w łatwy sposób uzyskać tak zwany loose coupling czyli tworzenie luźnych powiązań pomiędzy klasami. Dzięki temu kod jest łatwo testowany (w miejsce zależności produkcyjnych można podstawić zależności testowe tzw. pseudoimplementacje/mock-objects)

Show your support

Clapping shows how much you appreciated Mateusz Choma’s story.