2016-08-06 15 views
5

Nie mogę sobie wyobrazić sytuacji, w której potrzebuję skorzystać z usług dostawcy fabryki.Kiedy używać funkcji fabrycznych Angular 2?

Według oficjalnej docs https://angular.io/docs/ts/latest/guide/dependency-injection.html sytuacji jest to, że może nie być w stanie uzyskać dostęp do usługi (service-b) od wewnątrz innej usługi (serwis-a), ale funkcja fabryka ma (mają dostęp do usługi service-b). Kiedy coś takiego się naprawdę wydarzy?

+0

Gdzie mogę znaleźć tekst wspomniany w połączonym dokumencie? "nie można uzyskać dostępu do usługi (service-b) z innej usługi (service-a), ale funkcja fabryczna" –

+0

Taka była moja interpretacja dokumentów, poszukaj go w https: // angle .io/docs/ts/latest/guide/dependency-injection.html #! # injector-suppliers w sekcji "Factory provider" tuż przed tekstem "Dlaczego? My też nie wiemy. – johncol

Odpowiedz

6

Możesz zarejestrować się do operatora po prostu przepuszczając klasa

providers: [MyService] 

Zadziała tylko wtedy Angulars DI może instancję MyService.

Jeśli masz na przykład

@Injectable() 
class MyService { 
    constructor(private http: Http, private String configVal) {} 
} 

następnie DI nie w stanie utworzyć wystąpienie ponieważ String nie jest prawidłowym kluczem do dostawcy (prymitywne typy nie działają jako kluczowym dostawcą.

Jeśli potrzebujesz tego można użyć funkcji fabrycznego jak

providers: [ 
    { 
     provide: MyService, 
     useFactory: (http) => { 
     return new MyService(http, 'http://mydbserver.com:12345'); 
     }, 
     deps: [Http] 
    } 
] 

W ten sposób można w pełni kontrolować, w jaki sposób nowe dodatki jest tworzona i Angulars DI musi tylko wiedzieć, że musi wywołać funkcję fabryczną z instancją Http.

+0

Rozumiem, ale np. można łatwo utworzyć usługę MyConfigService, która podaje te wartości konfiguracyjne i wprowadza je do MyService. Nadal zastanawiam się, czy istnieje inny powód, dla którego ramy kątowe pozwalają nam definiować dostawców w ten sposób. W każdym razie, dziękuję za odpowiedź! – johncol

+1

Na przykład, jeśli chcesz wstrzyknąć klasy, które nie mają dekoratora "Injectable()" i nie możesz go dodać, ponieważ nie jesteś właścicielem źródła. Jestem pewien, że jest kilka innych. –

Powiązane problemy