niedziela, 12 maja 2024

Angular - Dependency Injection

DI (dependency injection) w Angularze pozwala na dostarczanie zale偶no艣ci. Po艣rednikiem mi臋dzy elementami i zale偶no艣ciami, kt贸re mo偶na wstrzykiwa膰, jest Injector. Gdy zale偶no艣膰 jest potrzebna, Injector sprawdza, czy istnieje jej instancja i je艣li nie, tworzy j膮 i dodaje do rejestru. W wi臋kszo艣ci przypadk贸w, mo偶esz u偶ywa膰 uproszczonego DI, jednak warto wiedzie膰, jak dzia艂a to pod spodem.

Rejestrowanie zale偶no艣ci

Zale偶no艣膰 mo偶na zarejestrowa膰 w kilku miejscach.

W metodzie bootstrapApplication - wtedy serwis b臋dzie dost臋pny w ca艂ej aplikacji.

Na poziomie komponentu - dodaj膮c j膮 do tablicy providers. W takiej sytuacji zostanie utworzona osobna instancja danej zale偶no艣ci.

Uwaga - zale偶no艣膰 mo偶na w ten spos贸b wstrzykn膮膰 do rodzica komponentu i b臋dzie ona dost臋pna dla wszystkich dzieci. 

Do Root Injectora, u偶ywaj膮c provideIn: 'root'

W tej sytuacji, Angular utworzy jedn膮 instancj臋 tego serwisu. 

Wstrzykiwanie zale偶no艣ci

Zale偶no艣膰 mo偶na wstrzykn膮膰 na dwa sposoby, przez konstruktor (stary spos贸b), albo przez metod臋 inject.

Hierarchia injektor贸w

Angular posiada 2 hierarchie injector贸w: Model Injector i Element Injector.

Model Injector

NullInjector

Jego zadaniem jest wyrzuci膰 b艂膮d, je艣li Angular nie znajdzie zale偶no艣ci.

Platform Module

Utworzony gdy wywo艂ywana jest metoda platformBrowserDynamic(), zawiera metody specyficzne dla platformy.

Root Injector

Gdy Angular startuje, tworzy Root Injector. Zawiera serwisy kt贸re nie s膮 lazy-loadowane z adnotacjami @ngModule i @Injectable. Do niego s膮 wstrzykiwane serwisy z adnotacj膮 provideIn: 'root'.

Child Injector

Injector utworzony dla ka偶dego lazy-loadowanego modu艂u.

Element Injector

Serwisy, kt贸re s膮 skonfigurowane w tablicy providers dla komponent贸w i dyrektyw. Domy艣lnie komponent b臋dzie poszukiwa艂 swojej zale偶no艣ci najpierw w swojej tablicy providers, a nast臋pnie w tablicach rodzic贸w.
Je艣li zale偶no艣膰 nie zostanie znaleziona, Angular sprawdzi w kt贸rym module jest zadeklarowany nasz komponent i zacznie przeszukiwanie od Root Injector w Model Injector.

 Na podstawie - https://www.youtube.com/watch?v=G8zXugcYd7o&t=51s&ab_channel=DecodedFrontend

oraz dokumentacji Angulara

Brak komentarzy:

Prze艣lij komentarz