2016-08-06 14 views
5

Ich kann mir keine Situation vorstellen, in der ich einen Fabriklieferanten benutzen muss.Wann wird die Angular 2 Factory-Funktion verwendet?

Nach der offiziellen docs https://angular.io/docs/ts/latest/guide/dependency-injection.html die Situation ist, dass man nicht in der Lage sein, kann in einem anderen Dienst von einem Dienst (Service-b) zuzugreifen (Service-a), aber, hat die Fabrik-Funktion (hat Zugang zu Service-b). Also, wann würde so etwas wirklich passieren?

+0

Wo finde ich den Text, den Sie im verknüpften Dokument angeben? "Man kann möglicherweise nicht von einem anderen Dienst (Dienst-a) aus auf einen Dienst (Dienst-b) zugreifen, aber die Factory-Funktion" –

+0

Das war meine Interpretation der Dokumente, suchen Sie in https: // eckig .io/docs/ts/neuste/guide/dependency-injection.html #! # Injektor-Anbieter unter der Rubrik "Factory-Anbieter" kurz vor dem Text "Warum? Wir wissen es auch nicht. So etwas passiert." – johncol

Antwort

6

Sie können für einen Anbieter registrieren, indem nur das Bestehen der Klasse

providers: [MyService] 

Dies funktioniert nur, wenn winkelförmigen Stangen DI MyService instanziieren.

Wenn Sie zum Beispiel

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

dann DI ist nicht Lage, eine Instanz zu schaffen, weil String kein gültiger Schlüssel für einen Provider (primitive Typen funktionieren nicht als Provider Schlüssel.

Wenn Sie diese benötigen, können Sie eine Fabrik Funktion wie

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

diese Weise können Sie vollständig steuern, wie eine neue ins Tance wird erstellt und Angulars DI muss nur wissen, dass es die Factory-Funktion mit einer Instanz von Http aufrufen muss.

+0

Ich bekomme das, aber z. Man kann leicht einen Dienst, MyConfigService, erstellen, der diese Konfigurationswerte liefert und in MyService einfügt. Ich frage mich also, ob es tatsächlich noch einen anderen Grund für den eckigen Rahmen gibt, der es uns ermöglicht, Provider auf diese Weise zu definieren. Wie auch immer, danke für deine Antwort! – johncol

+1

Zum Beispiel, wenn Sie Klassen injizieren wollen, die nicht den 'Injectable()' Dekorator haben und Sie können es nicht hinzufügen, weil Sie die Quelle nicht besitzen. Ich bin mir sicher, dass es mehrere andere gibt. –