Quand devrions-nous utiliser le fournisseur useExisting
au lieu de useClass
?
providers: [
{provide: Class1, useClass: Class1},
{provide: Class2, useExisting: Class2}]
REMARQUE: Je n'ai pas trouvé de question exacte sur SO. Et pour une meilleure indexation, j'ai décidé de créer celui-ci ici, même si j'ai trouvé ces réponses:
mais aimerait avoir plus d'exemples réels
Angular crée une fabrique pour les fournisseurs qui sera utilisée pour instancier le fournisseur.
J'utilise généralement le tableau suivant pour comprendre la différence entre les types de fournisseurs.
Comme nous pouvons le voir dans l'image ci-dessus, tous les fournisseurs peuvent être présentés de manière similaire useFactory
. Quand il est temps d'obtenir une instance de fournisseur angular appelle simplement la fonction factory
.
Ainsi, pour useClass
angular résout la dépendance du tableau de paramètres, puis appelle le constructeur avec les paramètres tandis que pour useExisting
angular obtient l'existant résolu) instance et le renvoie.
Cas d'utilisation:
1) N'exposez pas la pleine fonctionnalité
{ provide: PublicApi, useExisting: PrivateImpl }
{ provide: MinimalLogger, useExisting: LoggerService }
{ provide: PlatformRef, useExisting: PlatformRef_ }
{ provide: ApplicationRef, useExisting: ApplicationRef_}
{ provide: Sanitizer, useExisting: DomSanitizer },
{ provide: Compiler, useExisting: JitCompiler }
2) Construire un arbre
{ provide: Parent, useExisting: forwardRef(() => TreeViewComponent) }
3) Évitez la dépendance circulaire
{ provide: BaseComponent, useExisting: forwardRef(() => MyComponent) }
4) Fournir des jetons communs
{ provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true }
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => EmailValidator), multi: true }
{ provide: NgControl, useExisting: forwardRef(() => NgModel) }
{ provide: ControlContainer, useExisting: forwardRef(() => FormGroupDirective) }
{ provide: NG_VALUE_ACCESSOR, multi: true, useExisting: MyDatePickerComponent }
Si nous remplaçons useExisting
par useClass
, alors nous enregistrerions une nouvelle instance de classe
seExisting - crée une réfrence au service exemple ici
seClass - crée une nouvelle instance de service exemple ici
Normalement, vous obtenez une instance par fournisseur.
{provide: Class1, useClass: Class1},
est équivalent avec juste
Class1
Avec
{provide: Class1, useClass: Class3},
vous pouvez configurer, que lorsqu'un constructeur demande Class1
Angular DI crée une instance de Class3
et le transmet au constructeur.
{provide: Class2, useExisting: Class2}
n'entraîne pas la création d'une instance, mais vous pouvez le voir plutôt qu'un alias. Si un constructeur demande Class2
, Angular DI recherche un autre fournisseur pour la clé Class2
et injecte l'instance à partir de ce Class2
fournisseur. Vous pouvez voir useExisting
comme une référence à un autre fournisseur ou un alias.