Ich denke, die Antworten sind richtig, aber ich denke, etwas fehlt.
Was fehlt, ist "warum und was es löst?".
In Ordnung, lass uns anfangen.
Lassen Sie uns zuerst einige Informationen erwähnen:
Alle Module haben Zugriff auf die Root-Dienste.
So können auch faul geladene Module einen Dienst nutzen, der in bereitgestellt wurde app.module
.
Was passiert, wenn sich ein faul geladenes Modul selbst einen Dienst bereitstellt, den das App-Modul bereits bereitgestellt hat? Es wird 2 Instanzen geben.
Es ist kein Problem, aber manchmal ist es .
Wie können wir es lösen? Importieren Sie einfach kein Modul mit diesem Anbieter in faul geladene Module.
Ende der Geschichte.
Dies soll nur zeigen, dass faul geladene Module einen eigenen Injektionspunkt haben (im Gegensatz zu nicht faul geladenen Modulen).
Aber was passiert, wenn ein freigegebenes (!) Modul deklariert providers
wurde und dieses Modul von faul und importiert wird app.module
? Wieder, wie gesagt, zwei Fälle.
Wie können wir dies im gemeinsam genutzten Modul POV lösen? Wir brauchen einen Weg, um nicht zu benutzen providers:[]
! Warum? weil sie automatisch in Lazy und App.module importiert werden und wir das nicht wollen, da wir gesehen haben, dass jede eine andere Instanz hat.
Nun, es stellt sich heraus, dass wir ein gemeinsam genutztes Modul deklarieren können providers:[]
, das keine Anbieter hat , aber dennoch Anbieter bereitstellt (sorry :))
Wie? So was :
Beachten Sie, keine Anbieter.
Aber
Was passiert jetzt, wenn app.module das gemeinsam genutzte Modul mit POV of Service importiert? NICHTS.
Was passiert jetzt, wenn ein Lazy-Modul das gemeinsam genutzte Modul mit POV of Service importiert? NICHTS.
Eingabe des manuellen Mechanismus über Konvention:
Sie werden feststellen, dass die Anbieter auf den Bildern service1
und habenservice2
Dies ermöglicht uns den Import service2
für träge geladene Module und service1
für nicht faul geladene Module. ( Husten ... Router ... Husten )
Übrigens, niemand hält Sie davon ab, forRoot
innerhalb eines faulen Moduls anzurufen . Aber Sie werden 2 Instanzen haben, weil Sie app.module
es auch tun sollten - also tun Sie es nicht in faulen Modulen.
Auch - wenn app.module
Anrufe forRoot
(und niemand ruft forchild
) - ist das in Ordnung, aber Root-Injektor wird nur haben service1
. (für alle App verfügbar)
Warum brauchen wir es also? Ich würde sagen :
Es ermöglicht einem gemeinsam genutzten Modul, seine verschiedenen Anbieter aufzuteilen , um mit eifrigen Modulen und faulen Modulen verwendet zu werden - via forRoot
und forChild
Convention. Ich wiederhole: Konvention
Das ist es.
WARTEN !! kein einziges Wort über Singleton? Warum lese ich überall Singleton?
Nun - es ist im obigen Satz versteckt ^
Es ermöglicht ein gemeinsames Modul in der Lage sein zu spalten seinen verschiedenen Anbieter mit eifrigen Modulen und faul Module verwendet werden - über forRoot und forChild .
Die Konvention (!!!) erlaubt es, Singleton zu sein - oder genauer gesagt - wenn Sie der Konvention nicht folgen, erhalten Sie KEINEN Singleton.
Also , wenn Sie nur laden forRoot
in der app.module
, dann bekommt man nur eine Instanz , weil man nur nennen sollte forRoot
es in der app.module
.
Übrigens - an dieser Stelle können Sie vergessen forChild
. Das faul geladene Modul sollte / wird nicht aufrufen forRoot
- Sie sind also in POV von Singleton sicher.
forRoot und forChild sind kein unzerbrechliches Paket - es gibt nur keinen Grund, Root aufzurufen, das offensichtlich nur geladen wird, app.module
ohne die Fähigkeit für faule Module zu haben, ihre eigenen Dienste zu haben, ohne neue Dienste zu erstellen, die sein sollten -singleton.
Diese Konvention forChild
bietet Ihnen eine nette Möglichkeit , "Dienste nur für faul geladene Module" zu nutzen.
Hier ist eine Demo Root-Anbieter liefert positive Zahlen, faul geladene Module ergeben negative Zahlen.