Je pense que les réponses sont correctes mais je pense qu'il manque quelque chose.
La chose qui manque est "pourquoi et qu'est-ce que ça résout?".
OK commençons.
Commençons par mentionner quelques informations:
Tous les modules ont accès aux services racine.
Ainsi, même les modules chargés paresseusement peuvent utiliser un service fourni dans app.module
.
Que se passera-t-il si un module chargé paresseusement se fournira un service que le module d'application a déjà fourni? il y aura 2 instances.
Ce n'est pas un problème mais c'est parfois le cas .
Comment pouvons-nous le résoudre? N'importez simplement pas un module avec ce fournisseur dans des modules chargés différés.
Fin de l'histoire.
C'était juste pour montrer que les modules chargés différés ont leur propre point d'injection (par opposition aux modules non chargés différés).
Mais que se passe-t-il lorsqu'un module partagé (!) A été déclaré providers
et que ce module est importé par lazy and app.module
? Encore une fois, comme nous l'avons dit, deux cas.
Alors, comment pouvons-nous résoudre cela dans le module partagé POV? Nous avons besoin d'un moyen de ne pas utiliser providers:[]
! Pourquoi? car ils seront automatiquement importés à la fois dans la consommation paresseux et app.module et nous ne le voulons pas, car nous avons vu que chacun aura une instance différente.
Eh bien, il s'avère que nous pouvons déclarer un module partagé qui n'aura pas providers:[]
, mais fournira quand même des fournisseurs (désolé :))
Comment? Comme ça :
Avis, pas de fournisseurs.
Mais
que se passera-t-il maintenant lorsque app.module importera le module partagé avec POV de service? RIEN.
que se passera-t-il maintenant lorsqu'un module paresseux importera le module partagé avec POV de service? RIEN.
Saisie du mécanisme manuel par convention:
Vous remarquerez que les fournisseurs sur les photos ont service1
etservice2
Cela nous permet d'importer service2
pour les modules chargés différés et service1
pour les modules non différés. ( toux ... routeur .... toux )
BTW, personne ne vous empêche d'appeler forRoot
dans un module paresseux. mais vous aurez 2 instances car vous app.module
devriez également le faire - alors ne le faites pas dans des modules paresseux.
Aussi - si les app.module
appels forRoot
(et personne n'appelle forchild
) - c'est bien, mais l'injecteur racine n'aura que service1
. (disponible pour toutes les applications)
Alors pourquoi en avons-nous besoin? Je dirais :
Il permet à un module partagé, de pouvoir diviser ses différents fournisseurs, d'être utilisé avec des modules impatients et des modules paresseux - via forRoot
et par forChild
convention. Je répète: convention
C'est tout.
ATTENDRE !! pas un seul mot sur singleton ?? alors pourquoi est-ce que je lis singleton partout?
Eh bien - c'est caché dans la phrase ci-dessus ^
Il permet à un module partagé, de pouvoir diviser ses différents fournisseurs, d'être utilisé avec des modules impatients et des modules paresseux - via forRoot et forChild .
La convention (!!!) lui permet d'être singleton - ou pour être plus précis - si vous ne suivez pas la convention - vous n'obtiendrez PAS de singleton.
Ainsi, si vous ne chargez que forRoot
dans le app.module
, vous n'obtenez qu'une seule instance car vous ne devez l'appeler forRoot
que dans le app.module
.
BTW - à ce stade, vous pouvez oublier forChild
. le module chargé paresseusement ne devrait pas / ne sera pas appelé forRoot
- vous êtes donc en sécurité dans le POV de singleton.
forRoot et forChild ne sont pas un paquet incassable - c'est juste qu'il est inutile d'appeler Root qui ne sera évidemment chargé que dans app.module
sans donner la possibilité de modules paresseux, d'avoir leurs propres services, sans créer de nouveaux services-qui-devraient-être -singleton.
Cette convention vous donne une belle capacité appelée forChild
- à consommer des "services uniquement pour les modules chargés paresseusement".
Voici une démo Les fournisseurs de racine donnent des nombres positifs, les modules chargés paresseusement donnent des nombres négatifs.