2016-01-04 22 views
6

Próbuję zrozumieć konieczność dodawania @Injectable() dekoracji usługami w kątowej 2.kątowa 2 @Injectable() - jak to działa

Z dokumentacji: https://angular.io/docs/ts/latest/guide/dependency-injection.html

Dlaczego don” t dodajemy @Injectable() do HeroesComponent? Możemy to dodać, jeśli naprawdę chcemy. Nie jest to konieczne, ponieważ HeroesComponent jest już ozdobiony @Component. TypeScript generuje metadane dla dowolnej klasy za pomocą dekoratora, a zrobi to dowolny dekorator.

Więc w zasadzie trzeba tylko dodać @Injectable() jeśli żadna inna dekoracja jest dostępna, ponieważ jeśli jest ozdobą każdego rodzaju dostępne, kompilator maszynopis automatycznie wygeneruje informacji o zależnościach w oparciu o zmienne, które przeszły w konstruktora, np .: constructor(private logger: Logger)

Czy to prawda? Dzięki

+5

To jest prawda .. – alexpods

+5

Ja lol'd @alexpods. Co powiesz na dodanie go jako odpowiedzi: D? Aby nieco się uzupełnić, przeczytaj [komentarz] (https://github.com/angular/angular/issues/4404#issuecomment-143920530), cały ten problem jest interesujący, ale nie w pełni powiązany z twoim pytaniem. –

Odpowiedz

7

Myślę, że nazwa jest nieco dziwna i naprawdę nie rozumiem, dlaczego mówią, aby dodać go do najlepszych praktyk. Jeśli dodawanie go do każdej klasy jest najlepszą praktyką, nie rozumiem, dlaczego jest to w ogóle potrzebne. Łatwiej byłoby sprawdzić strukturę każdej klasy, jeśli konstruktor potrzebuje rzeczy wstrzykniętych lub nie. Mogło to zostać rozwiązane za pomocą właściwości linii poleceń w maszynopisie, aby zawsze generować (symulować) metadane.

Porada, aby zawsze dodawać, jak sądzę, jest podobna do kompilatora, zawsze dodawać metadane (co nie jest możliwe, o ile wiem). Możesz również (z czujnością) tylko (i zawsze) dodać ją do klas, które wymagają rzeczy wstrzykniętych - nawet jeśli mają innego dekoratora. To prawdopodobnie byłoby najbardziej jednoznaczne rozwiązanie - ale hej - bycie niechlujnym może być zarówno złe, jak i dobre. W tym przypadku będziesz sędzią.

TL; DR Jeśli masz żadnych innych dekoratorówI ty jeśli Twój konstruktor potrzebuje usługi/etc wstrzykuje, następnie jest to potrzebne.

+1

Aby wyjaśnić, nie jest konieczne, aby klasy, które mają inne konstruktory klas, rozszerzały się z 'Injectable' (' Component', etc) ** lub ** dla klas, które mają swoje właściwości konstruktora z adnotacją 'Inject' (np. W ES.next kod). – estus

Powiązane problemy