2016-04-25 12 views
3

Wie hoch ist die Lebensdauer von Abhängigkeiten, die im Nicht-Root-Injektor bereitgestellt werden?Hierarchischer Injektor und Abhängigkeitsdauer

Kontext:

Meine Angular 2 App besteht aus mehreren Abschnitten. Es gibt eine @RouteConfig an der Wurzel-Komponente mit Routen zu den Komponenten A, B und C. Die Komponente B hat ein Kind @RouteConfig zu den Unterabschnitten x und y.

/A 
/B 
    /x 
    /y 
/C 

Component xq einen Service benötigt. Wie in J. Papa's Angular 2 style guide empfohlen, sofern ich den Dienst zu dem Injektor auf der Komponentenebene x, d.h.

@xComponent({ 
    providers: [q] 
}) 
export class xComponent { ... } 

Dienst q Anfragen und speichert intern einige Daten. Ich hatte den Eindruck, dass es sich bei den Diensten um Singletons handelt und dass die Daten bei nachfolgenden Besuchen unter /B/x aus dem Cache verfügbar wären. Mit dem obigen Setup werden die Daten jedes Mal, wenn der Benutzer den Abschnitt /B/x öffnet, erneut angefordert. Ich legte eine console.log("creating q") in den Konstruktor für Service q und sehen, dass eine neue Instanz des Dienstes erstellt wird, wann immer /B/x besucht wird.

Wenn ich den Dienst auf der Ebene der Komponente /B liefern, wird der Wert zwischengespeichert, wenn zwischen /B/x und /B/y, verlor aber die Navigation, wenn sie entweder /A oder /C navigieren.

Es scheint, dass der Injektor zerstört wird, wenn die Komponente zerstört wird. Ist das erwartetes Verhalten?

Was ist der richtige Weg, um die App so zu konfigurieren, dass der Dienst nicht neu erstellt wird? Natürlich könnte ich den Dienst auf der Ebene der Root-Komponenten bereitstellen, aber vielleicht fehlt mir etwas?

Antwort

1

Sie verstehen das Verhalten der Injektoren vollständig. Sie sind dort zu Komponenten hinzugefügt und werden mit ihren Komponenten zerstört.

Also in Ihrem Fall müssen Sie wirklich den Service als einen globalen hinzufügen. Dies wird es zu einem "Singleton" machen.


Zusätzliche Verbindungs ​​

Wenn Sie mehr über Dependency Injection in angular2 lernen wollen, kann ich diesen Artikel empfehlen: http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

+0

Danke, der "mit den Komponenten zerstört" -Teil war was ich vermisste. Ich frage mich - ist das irgendwo dokumentiert? Es scheint weder im Artikel von ibdtram.io noch in den Dokumenten von Angular 2 erwähnt zu werden. –

+0

@ RonaldZarīts Ich denke nicht, aber das ist der logische Weg, denn sonst würden Sie eine Tonne Injektoren in einer riesigen Anwendung herumliegen lassen. – Dinistro

2

Angular2 Teammitglieder betonten mehrfach, dass Instanzen von DI nicht Singletons sind (sie betrachten Singletons als ein nicht allzu gutes Designmuster).

Stattdessen verwaltet Angular2 DI eine einzelne Instanz pro Anbieter.

Angular erstellt auch einen Baum von Injektoren, der Ihrem Komponentenbaum ähnelt.

Wenn eine Komponente ein neues Kind Injektor geschaffen wird für diese Komponente erstellt wird (und auch zerstört, wenn die Komponente zerstört wird)

Das Kind Injektor hat seinen eigenen Satz von Anbietern aus den Komponenten providers: Liste.

Wenn der Kind-Injektor keinen Provider für einen angeforderten Schlüssel (Token oder Typ) finden kann, leitet er die Anfrage an die Eltern-Injektoren weiter.

Fazit

Wenn Sie nur eine einzige Instanz eines Service, um sicherzustellen, in Ihrer Anwendung erstellt wird, registrieren Sie sie mit der providers: [...] Liste Ihrer Stammkomponente (vorgeschlagen) oder alternativ mit bootstrap(...).

+2

Von [Angular 2 Hierarchical DI docs] (https: // angular.io/docs/ts/latest/guide/hierarchical-dependency- injection.html). "Es kann nur eine Instanz eines Servicetyps in einem bestimmten Injektor geben. Aber wir haben gelernt, dass mehrere Injektoren auf verschiedenen Ebenen des Komponentenbaums der Anwendung arbeiten können. Jeder dieser Injektoren könnte seine eigene Instanz des Services haben. " Das ist alles gut. Ich (fälschlicherweise) dachte, dass der Injektor irgendwie bleiben würde. Ihr Kommentar "... mit der Komponente zerstört") ist kritisch. Vielen Dank! –

Verwandte Themen