web-dev-qa-db-fra.com

useClass vs useExisting

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

18
Stepan Suvorov

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.

enter image description here

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

12
yurzui

seExisting - crée une réfrence au service exemple ici
seClass - crée une nouvelle instance de service exemple ici

21
izik f

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.

21
Günter Zöchbauer