@Injectable()
du service lui-même (généralement au niveau de la racine de l'application),
les outils d'optimisation tels que ceux utilisés par les versions de production de la CLI peuvent effectuer un tremblement d'arbre,
ce qui supprime les services qui ne sont pas utilisés par votre application. La secousse des arbres réduit la taille des faisceaux.UserService
à de nombreux endroits dans l'application et voudrez injecter la même instance
de service à chaque fois. Fournir UserService
via l'injecteur root
est un bon choix.
Il s'agit du paramètre par défaut utilisé par la CLI Angular lorsque vous générez un service pour votre application.providedIn:'root'
, vous configurez l'injecteur de racine pour l'application , qui est l'injecteur AppModule
.
La racine réelle de toute la hiérarchie des injecteurs est un injecteur de plate-forme qui est le parent des injecteurs de racine d'application.
Cela permet à plusieurs applications de partager une configuration de plate-forme. Par exemple, un navigateur ne possède qu'une seule barre d'URL,
quel que soit le nombre d'applications que vous exécutez.extraProviders
utilisant
la fonction platformBrowser()
.NgModule
peuvent être spécifiés avec l'option de métadonnées des fournisseurs @NgModule()
ou
avec l'option @Injectable()
fourni (avec certains modules autres que l'AppModule racine).@NgModule()
fournit si un module est chargé paresseux.
L'injecteur du module est configuré avec le fournisseur lorsque ce module est chargé, et Angular peut injecter les services correspondants
dans n'importe quelle classe créée dans ce module. Si vous utilisez l'option @Injectable()
fournie dans: MyLazyloadModule
,
le fournisseur peut être modifié au moment de la compilation, s'il n'est utilisé nulle part ailleurs dans l'application.HeroComponent
est créé au démarrage de l'application et n'est jamais détruit.
L'instance HeroService
créée pour HeroComponent
est donc conservée pendant toute la vie de l'application.
Si vous souhaitez restreindre l'accès de HeroService
à HeroComponent
et à son composant imbriqué HeroListComponent
,
fournissez HeroService
au niveau du composant, dans les métadonnées HeroComponent
.@Injectable()
identifie chaque classe de service.
L'option de métadonnées fourni pour une classe de service configure un injecteur spécifique pour utiliser la classe décorée en tant que fournisseur du service.
Lorsqu'une classe injectable fournit son propre service à l'injecteur racine, le service est disponible partout où la classe est importée.HeroService
à l'aide du décorateur @Injectable()
de la classe.HeroService
en appelant son
constructeur et de la mise à disposition de cette instance dans l'application.NgModule
spécifique.@Injectable()
configure un fournisseur disponible dans tout injecteur incluant le module HeroModule
.NgModule
lui-même,
sauf que le service peut être utilisé dans les arbres si le NgModule
ne l'utilise pas.
Cela peut être utile pour une bibliothèque qui propose un service particulier que certains composants
pourraient vouloir injecter de manière optionnelle, et laisse à l'application le soin de fournir le service.providedIn
pour un module Ng non-racine,
afin de limiter la portée du fournisseur à ce module. Cela équivaut à spécifier le module non racine dans les métadonnées @Injectable()
,
sauf que le service fourni de cette façon n'est pas arborant.AppModule
avec providedIn
,
car l'injecteur racine de l'application est l'injecteur AppModule
.
Toutefois, si vous configurez un fournisseur d'application dans les métadonnées @NgModule()
pour AppModule
,
il remplace celui configuré pour root dans les métadonnées @Injectable()
.
Pour ce faire, vous pouvez configurer un fournisseur autre que celui par défaut d'un service partagé avec plusieurs applications.NgModule
ont leurs propres injecteurs.
Vous pouvez limiter la portée d'un fournisseur à un composant et à ses enfants en configurant le fournisseur au niveau
du composant à l'aide des métadonnées @Component
HeroesComponent
qui spécifie dans HeroService
son tableau providers
.
HeroService
peut fournir des héros aux instances de ce composant ou à toute instance de composant enfant.DOM
différent utilise un injecteur différent.@Component()
est héritée de @Directive()
.
Les directives peuvent également avoir des dépendances et vous pouvez configurer les fournisseurs dans leurs métadonnées @Directive()
.
Lorsque vous configurez un fournisseur pour un composant ou une directive à l'aide de la propriété providers, ce fournisseur appartient
à l'injecteur de l'élément DOM
d'ancrage. Les composants et les directives sur le même élément partagent un injecteur.AppComponent
, qui comporte des sous-composants, tels que HeroesListComponent
.
HeroesListComponent
contient et gère plusieurs instances de HeroTaxReturnComponent
.
Le diagramme suivant représente l'état de cette arborescence de composants à trois niveaux lorsque trois instances de HeroTaxReturnComponent
sont ouvertes simultanément.@Host()
au paramètre service dépendant du constructeur d'un composant.
La recherche de fournisseurs s'arrête au niveau de l'injecteur pour l'élément hôte du composant.@Host
avec @Optional
, un autre décorateur de paramètres qui vous permet de gérer le cas null
si aucun fournisseur n'est trouvé.@Host
et les injecteurs d'éléments.AppModule
), l'arborescence des injecteurs semble être plate.
Toutes les demandes sont transmises à l'injecteur racine, que vous l'ayez configuré avec la méthode bootstrapModule
ou enregistré tous les fournisseurs avec la racine dans
leurs propres services.VillainsListComponent
qui affiche une liste des méchants.
Il obtient ces méchants d'un VillainsService
.VillainsService
à la racine AppModule
(où vous avez enregistré le fichier HeroesService
),
cela le rendrait VillainsService
disponible partout dans l'application, y compris les flux de travail Hero.
Si vous modifiez ensuite le VillainsService
, vous pouvez casser quelque chose quelque part dans un composant héros.
Fournir le service dans la racine AppModule
crée ce risque.VillainsService
aux métadonnées providers
de VillainsListComponent
suivantes :VillainsService
dans les métadonnées VillainsListComponent
et nulle part ailleurs,
le service devient disponible uniquement dans l'arborescence VillainsListComponent
et ses sous-composants.
C'est toujours un singleton, mais c'est un singleton qui existe uniquement dans le domaine des méchants.HeroListComponent
qui affiche une liste de héros.HeroTaxReturnComponent
a une logique pour gérer et restaurer les changements.
Ce serait une tâche assez facile pour une simple déclaration de revenus de héros. Dans le monde réel,
avec un modèle de données de déclaration de revenus riche, la gestion du changement serait délicate.
Vous pouvez déléguer cette gestion à un service d'assistance, comme le montre cet exemple.HeroTaxReturnService
. Il en cache un HeroTaxReturn
, suit les modifications
apportées à ce retour et peut le sauvegarder ou le restaurer. Il délègue également au
singleton d'application HeroService, qu'il obtient par injection.HeroTaxReturnComponent
qui s'en sert.input
qui est implémentée avec les getters
et les setters
.
Le configurateur initialise propre l'instance du composant HeroTaxReturnService
avec le retour entrant.
Le getter
renvoie toujours ce que le service dit être l'état actuel du héros.
Le composant demande également au service de sauvegarder et de restaurer cette déclaration de revenus.HeroTaxReturnComponent
fournir le service,
à l'aide de la propriété providers
dans les métadonnées du composant.HeroTaxReturnComponent
a son propre fournisseur de HeroTaxReturnService
.
Rappelez-vous que chaque instance de composant a son propre injecteur.
La fourniture du service au niveau du composant garantit que chaque instance du composant obtient sa propre instance privée
du service et qu'aucune déclaration de revenus n'est remplacée.Car
qui dépend de plusieurs services. Supposons que vous ayez configuré l'injecteur racine (marqué A)
avec des fournisseurs génériques pour CarService
, EngineService
et TiresService
.CarService
et EngineService
disposant de fonctionnalités spéciales adaptées à tout ce qui se passe dans le composant (B).CarService
.Car
composant le plus profond (C), son injecteur génère une instance Car
résolue par l'injecteur (C)
avec une résolution Engine
par l'injecteur (B) et celle Tires
résolue par l'injecteur de racine (A).