web-dev-qa-db-ja.com

useClassとuseExisting

useExistingの代わりにuseClassプロバイダーを使用する必要があるのはいつですか?

providers: [
{provide: Class1, useClass: Class1}, 
{provide: Class2, useExisting: Class2}]

備考:SOで正確な質問が見つかりませんでした。そして、より良い索引付けのために、この特定のものをここに作成することにしましたが、私はこの答えを見つけました:

しかし、より現実的な例が欲しい

18
Stepan Suvorov

Angularは、プロバイダーのインスタンス化に使用されるプロバイダー用のファクトリーを作成します。

通常、次の表を使用して、プロバイダーの種類の違いを理解します。

enter image description here

上の図からわかるように、すべてのプロバイダーに同じようなuseFactoryを提示できます。プロバイダーのインスタンスを取得するときがきたときangularはfactory関数を呼び出すだけです。

したがって、useClass angularはパラメーター配列から依存関係を解決し、パラメーターを使用してコンストラクターを呼び出しますが、useExisting angularは既存の解決済みを取得しますインスタンスとそれを返します。

ユースケース:

1)完全な機能を公開しない

{ 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)ツリーを構築する

{ provide: Parent, useExisting: forwardRef(() => TreeViewComponent) }

3)循環依存を回避する

{ provide: BaseComponent, useExisting: forwardRef(() => MyComponent) }

4)共通のトークンを提供する

{ 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 }

useExistinguseClassに置き換えると、新しいクラスインスタンスが登録されます。

12
yurzui

useExisting-サービスに参照を作成 ここに例
useClass-サービスの新しいインスタンスを作成 ここに例

21
izik f

通常、プロバイダーごとにインスタンスを取得します。

{provide: Class1, useClass: Class1}, 

と同じです

Class1

{provide: Class1, useClass: Class3}, 

コンストラクターがClass1 Angular DIを要求すると、Class3のインスタンスが作成され、それがコンストラクターに渡されるように構成できます。

{provide: Class2, useExisting: Class2}

インスタンスが作成されることはありませんが、エイリアスではなくこれが表示されます。コンストラクターがClass2を要求した場合、Angular DIはキーClass2の別のプロバイダーを探し、このClass2プロバイダーからインスタンスを注入します。次のようなuseExisting別のプロバイダーまたはエイリアスへの参照。

21