Logger
elle-même fournit une instance Logger
.Provider
.
Les extraits de code suivants montrent comment une classe donnée en tant que valeur providers
et développée dans un objet fournisseur complet.provide
contient le jeton qui sert de clé pour localiser une valeur de dépendance et configurer l'injecteur.useClass
, comme dans l'exemple. Il peut aussi être useExisting
, useValue
ou useFactory
. Chacune de ces clés fournit un type de dépendance différent, comme indiqué ci-dessous.BetterLogger
lorsque le composant demande un enregistreur utilisant le jeton Logger
.
EvenBetterLogger
pourrait afficher le nom d'utilisateur dans le message du journal.
Cet enregistreur obtient l'utilisateur à partir d'une instance UserService
injectée.
UserService
.
Configurez cet autre enregistreur avec la useClass
clé de définition du fournisseur, telle que BetterLogger
.
Le tableau suivant spécifie les deux fournisseurs dans l'option providers de métadonnées du module ou du composant parent.OldLogger
.
OldLogger
a la même interface que NewLogger
, mais pour une raison quelconque,
vous ne pouvez pas mettre à jour l'ancien composant pour l'utiliser.OldLogger
, vous voulez que l'instance singleton de NewLoggerle
gère à la place.
Dans ce cas, l'injecteur de dépendance doit injecter cette instance singleton lorsqu'un composant demande le nouveau ou l'ancien consignateur.
OldLogger
devrait être un alias pour NewLogger
.OldLogger
à NewLogger
avec useClass
,
vous vous retrouvez avec deux différentes instances NewLogger
dans votre application.NewLogger
, alias OldLogger
avec l'option useExisting
.
useValue
.useValue
pour associer la variable au jeton Logger
.
HERO_DI_CONFIG
constante est conforme à l'interface AppConfig
.
Malheureusement, vous ne pouvez pas utiliser une interface TypeScript
en tant que jeton.
Dans TypeScript
, une interface est un artefact de conception et n'a pas de représentation à l'exécution (jeton) utilisable par la structure DI.JavaScript
n'a pas d'interface. Ainsi, lorsque l'interface TypeScript
est transpilée en JavaScript
,
l'interface disparaît. Angular n'a plus aucune information de type d'interface à trouver au moment de l'exécution.NgModule
AppModule
.InjectionToken
.
L'exemple suivant montre comment définir un tel jeton.
InjectionToken
:@Inject()
.
AppConfig
ne joue aucun rôle dans l'injection de dépendance,
elle prend en charge la saisie de l'objet de configuration dans la classe.
EvenBetterLogger
, a besoin de HeroService
pour savoir si l'utilisateur est autorisé à voir des héros secrets.
Cette autorisation peut changer au cours d'une session d'application unique, comme lorsque vous vous connectez à un autre utilisateur.HeroService
, car vous ne souhaitiez pas compliquer
ce service avec des informations confidentielles. HeroService
n'aura pas d'accès direct aux informations de l'utilisateur pour
décider qui est autorisé et qui ne l'est pas.HeroService
un drapeau booléen lui permettant de contrôler l'affichage des héros secrets.Logger
, mais vous ne pouvez pas injecter isAuthorized
. Au lieu de cela, vous pouvez utiliser un
fournisseur d'usine pour créer une nouvelle instance de consignateur HeroService
.HeroService
n'ait pas accès à UserService
, la fonction usine le fait.
Vous injectez les deux Logger
et UserService
chez le fournisseur de l'usine et laissez l'injecteur les transmettre à la fonction de l'usine.useFactory
indique à Angular que le fournisseur est une fonction fabrique dont la mise en oeuvre est heroServiceFactory
.Logger
et UserService
servent de jetons pour leurs propres fournisseurs de classes. L'injecteur résout ces jetons et injecte les services correspondants dans les paramètres de fonction d'usine correspondants.heroServiceProvider
.
Cette étape supplémentaire rend le fournisseur d'usine réutilisable.
Vous pouvez configurer un fournisseur de HeroService
avec cette variable partout où vous en avez besoin. Dans cet exemple,
vous en avez besoin uniquement dans HeroesComponent
, où heroServiceProvider
remplace HeroService
dans le tableau providers
de métadonnées.heroes.component (v3)
heroes.component (v2)
PLATFORM_INITIALIZER :
Le rappel est appelé lorsqu'une plate-forme est initialisée.APP_BOOTSTRAP_LISTENER :
Le rappel est appelé pour chaque composant démarré. La fonction de gestionnaire reçoit l'instance ComponentRef
du composant amorcé.APP_INITIALIZER :
Le rappel est appelé avant qu'une application ne soit initialisée. Tous les initialiseurs enregistrés peuvent éventuellement renvoyer une promesse.
Toutes les fonctions d'initialisation qui renvoient des promesses doivent être résolues avant le démarrage de l'application.
Si l'un des initialiseurs ne parvient pas à résoudre, l'application n'est pas démarrée.true
que vous pouvez utiliser APP_INITIALIZER
pour enregistrer plusieurs
gestionnaires pour l'événement fournisseur.NG_VALIDATORS
intégré et fournir
plusieurs instances d'un fournisseur de validateur donné à l'aide de la multi: truepropriété de l'objet fournisseur.
Angular ajoute vos validateurs personnalisés à la collection existante.RouterModule.forRoot
et RouterModule.forChild
dans un seul module,
le jeton ROUTES
combine tous les différents ensembles de routes fournis en une seule valeur.injector.get
(Service),
Angular ne peut pas identifier tous les endroits de votre code où cette injection pourrait avoir lieu.
Il n'a donc pas d'autre choix que d'inclure le service dans l'injecteur. Ainsi, les services fournis
au niveau de NgModule
ou de composant ne peuvent pas être transformés en arborescence.NgModule
.ngc
est exécuté, il compile AppModule
dans une fabrique de modules, qui contient les définitions de tous les fournisseurs
déclarés dans tous les modules qu'il inclut. Au moment de l'exécution, cette usine devient un injecteur qui instancie ces services.@Injectable()
.
L'exemple suivant montre l'équivalent en arbre de l'exemple ServiceModule
ci-dessus.
providers
: []array
du décorateur @NgModule()
ou @Component()
.