Définir les fournisseurs
Une dépendance ne peut pas toujours être créée par la méthode d'instanciation d'une classe par défaut.
Vous avez découvert d'autres méthodes dans les fournisseurs de dépendance.
L'exemple
HeroOfTheMonthComponent
suivant montre plusieurs des alternatives et pourquoi vous en avez besoin.
C'est visuellement simple: quelques propriétés et les journaux produits par un enregistreur.
Le code sous-jacent personnalise comment et où le framework DI fournit des dépendances.
Les cas d'utilisation illustrent différentes manières d'utiliser le littéral de fourniture
d'objet pour associer un objet de définition à un jeton DI.
Le tableau
providers
montre comment vous pouvez utiliser les différentes clés de définition de fournisseur.
useValue
,
useClass
,
useExisting
ou
useFactory
.
Fournisseurs de valeur : useValue
La clé
useValue
vous permet d'associer une valeur fixe à un jeton DI.
Utilisez cette technique pour fournir des constantes de configuration d'exécution telles que les adresses de base
de sites Web et les indicateurs de fonctionnalités. Vous pouvez également utiliser un fournisseur de valeur dans
un test unitaire pour fournir des données fictives à la place d'un service de données de production.
L'exemple
HeroOfTheMonthComponent
a deux fournisseurs de valeur.
- La première fournit une instance existante de la classe
Hero
à utiliser pour le jeton Hero
, au lieu de demander à l'injecteur de créer une nouvelle instance new
ou d'utiliser sa propre instance mise en cache. Ici, le jeton est la classe elle-même.
- La seconde spécifie une ressource chaîne littérale à utiliser pour le jeton
TITLE
. Le jeton TITLE
fournisseur n'est pas une classe, mais un type spécial de clé de recherche de fournisseur appelé jeton d'injection , représenté par une instance InjectionToken
.
Vous pouvez utiliser un jeton d'injection pour tout type de fournisseur, mais cela s'avère particulièrement utile lorsque la dépendance est une valeur simple, telle qu'une chaîne, un nombre ou une fonction.
La valeur d'un fournisseur de valeur doit être définie avant que vous le spécifiiez ici.
Le littéral de chaîne de titre est immédiatement disponible.
La variable
someHero
dans cet exemple a été définie précédemment dans le fichier, comme indiqué ci-dessous.
Vous ne pouvez pas utiliser une variable dont la valeur sera définie ultérieurement.
D'autres types de prestataires peuvent créer leurs valeurs paresseusement ; c'est-à-dire, quand ils sont nécessaires pour l'injection.
Fournisseurs de classe: useClass
La clé
useClass
de fournisseur vous permet de créer et de renvoyer une nouvelle instance de la classe spécifiée.
Vous pouvez utiliser ce type de fournisseur pour remplacer une implémentation alternative par une classe commune ou par défaut.
L'implémentation alternative pourrait, par exemple, implémenter une stratégie différente, étendre la classe par défaut ou émuler
le comportement de la classe réelle dans un scénario de test.
Le code suivant montre deux exemples dans
HeroOfTheMonthComponent
.
Le premier fournisseur est la forme développée et sucrée du cas le plus typique dans lequel la classe à créer (
HeroService
) est également
le jeton d'injection de dépendance du fournisseur. La forme courte est généralement préférée; cette forme longue rend les détails explicites.
Le deuxième fournisseur se substitue
DateLoggerService
à
LoggerService
.
LoggerService
est déjà inscrit au niveau
AppComponent
.
Lorsque ce composant enfant le demande
LoggerService
, il reçoit une instance
DateLoggerService
à la place.
Ce composant et son arborescence de composants enfants reçoivent une instance
DateLoggerService
.
Les composants situés en dehors de l'arborescence continuent de recevoir l'instance
LoggerService
d'origine.
DateLoggerService
hérite de
LoggerService
; il ajoute la date/heure actuelle à chaque message :
Alias providers: useExisting
La clé
useExisting
de fournisseur vous permet de mapper un jeton sur un autre.
En effet, le premier jeton est un alias du service associé au deuxième jeton, ce qui crée deux façons d'accéder au même objet de service.
Vous pouvez utiliser cette technique pour restreindre une API via une interface d'alias.
L'exemple suivant montre un alias introduit à cet effet.
Imaginez que
LoggerService
ait une grande API, beaucoup plus grande que les trois méthodes et une propriété.
Vous voudrez peut-être réduire cette surface d'API aux membres dont vous avez réellement besoin.
Dans cet exemple, l'interface de classe
MinimalLogger
réduit l'API à deux membres:
L'exemple suivant utilise
MinimalLogger
dans une version simplifiée de
HeroOfTheMonthComponent
.
Le paramètre
HeroOfTheMonthComponent
du constructeur
logger
est saisi de la
MinimalLogger
manière suivante :
seuls les membres
logs
et
logInfo
sont donc visibles dans un éditeur compatible avec
TypeScript
.
Dans les coulisses, Angular définit le paramètre
logger
sur le service complet enregistré sous le jeton
LoggingService
,
qui se trouve être l'instance
DateLoggerService
fournie ci-dessus.
Ceci est illustré dans l'image suivante, qui affiche la date de journalisation.
Fournisseurs d'usine: useFactory
La clé
useFactory
de fournisseur vous permet de créer un objet de dépendance en appelant une fonction de fabrique, comme dans l'exemple suivant.
L'injecteur fournit la valeur de dépendance en appelant une fonction de fabrique que vous indiquez comme valeur de la clé
useFactory
.
Notez que cette forme de fournisseur a une troisième clé deps, qui spécifie les dépendances de la fonction
useFactory
.
Utilisez cette technique pour créer un objet de dépendance avec une fonction fabrique dont les entrées combinent des services injectés et un état local.
L'objet de dépendance (renvoyé par la fonction
factory
) est généralement une instance de classe, mais peut également être différent.
Dans cet exemple, l'objet de dépendance est une chaîne des noms des coureurs jusqu'au concours "Héros du mois".
Dans l'exemple, l'état local est le nombre 2, le nombre de gagnants que le composant doit afficher.
La valeur d'état est transmise entant qu'argument
runnersUpFactory()
. Les
runnersUpFactory()
rendements de la fonction usine de fournisseur,
qui peut utiliser à la fois la valeur d'état-passé et les services injectés
Hero
et
HeroService
.
La fonction de fabrique du fournisseur (renvoyée par
runnersUpFactory()
) renvoie l'objet de dépendance réel, la chaîne de noms.
- La fonction prend un gagnant
Hero
et un HeroService
comme arguments. Angular fournit ces arguments à partir des valeurs injectées identifiées par les deux jetons du tableau.
- La fonction retourne la chaîne de noms, qui Angular qu'injecte dans le
runnersUp
param de HeroOfTheMonthComponent
.