Kurs AngularJS #10 – Dependency Injection

Dependency Injection czyli w skrócie DI to wzorzec polegający na radzeniu sobie z zależnościami jednych obiektów w naszej aplikacji od innych. Odpowiedzialny za to system w Angularze zarządza tworzeniem komponentów, rozwiązywaniem ich zależności i dostarczaniem ich do innych komponentów kiedy istnieje taka potrzeba.

Korzystaliśmy z tego rozwiązania już wielokrotnie gdyż do tej pory napisaliśmy już kilka rzeczy w Angularze i rzadko zdarzało się nam poradzić sobie z jakimiś bardziej złożonymi zadaniami bez zewnętrznych zależności. Od tego właśnie są – nie ma sensu pisać niektórych rzeczy jeszcze raz i odkrywać koła na nowo, skoro ktoś już zrobił to za nas i możemy z tego skorzystać przyspieszając naszą pracę. Jedynie dla przypomnienia wspomnę, że z definiowania zależności korzystamy tworząc jakiś nowy kontroler, dyrektywę, usługę, komponent, filtr czy moduł a więc praktycznie wszystko co w Angularze stworzyć możemy. Również jeśli korzystamy z run()config() modułu i potrzebujemy dodatkowych funkcjonalności działa ten sam mechanizm.

Dla przypomnienia pokażę Ci jeszcze raz jak do tej pory za każdym razem definiowaliśmy nasze zależności:

Zależności jak wspomniałem możemy również wstawiać do config() czy też run() w naszym modelu. Również i tutaj wygląda to dokładnie tak samo. A o tym czym te funkcje dokładnie są i za co są odpowiedzialne powiemy sobie szerzej w artykule poświęconym stricte modułom.

Samo wstawianie zależności do naszych obiektów możemy jednak zdefiniować na trzy różne sposoby. Moim zdaniem ten z którego korzystaliśmy do tej pory – wykorzystujący tablicę jest najwygodniejszy ale żebyś był w pełni rozeznany w temacie przyjrzymy się również innym.

Zależności przy pomocy tablicy

Jest to preferowany przeze mnie sposób wstawiania zależności, dlatego też korzystamy z niego od samego początku. Jak już wiesz jako drugi argument  jakiegoś obiektu zamiast funkcji która go definiuje podajemy tablicę a w niej zapisujemy na początku wszystkie zależności i jako ostatni element podajemy funkcję definiującą z parametrami których nazwy odpowiadają potrzebnym nam zależnościom które mamy podane wcześniej.

Zależności przy wykorzystaniu $inject

Jeśli chcemy pozwolić minifikatorowi na zmianę nazw parametrów funkcji i dalej być w stanie podać jakieś zależności przy założeniu, że po minifikacji to wszystko dalej ma działać powinniśmy skorzystać z $inject.

Notacja domniemana

Jeśli zminifikujesz swój kod w którym zależności podane są w taki sposób nie masz co liczyć na to, że będzie działał poprawnie, jest to jednak najszybsza i najprostsza metoda.

Tutaj do funkcji która definiuje nasz obiekt zwyczajnie podajemy nasze zależności ale już bez tablicy tak jak robiliśmy to od tej pory i bez wymienienia wcześniejszych elementów które były tymi zależnościami w postaci ciągów znaków.

Używanie takiego stylu wstawiania zależności jest mocno odradzane i istnieje nawet specjalna dyrektywa ngStrictDi której użycie powoduje wyrzucenie błędu za każdym razem kiedy chcemy wstawić zależności w ten sposób.