useExisting
の代わりにuseClass
プロバイダーを使用する必要があるのはいつですか?
providers: [
{provide: Class1, useClass: Class1},
{provide: Class2, useExisting: Class2}]
備考:SOで正確な質問が見つかりませんでした。そして、より良い索引付けのために、この特定のものをここに作成することにしましたが、私はこの答えを見つけました:
しかし、より現実的な例が欲しい
Angularは、プロバイダーのインスタンス化に使用されるプロバイダー用のファクトリーを作成します。
通常、次の表を使用して、プロバイダーの種類の違いを理解します。
上の図からわかるように、すべてのプロバイダーに同じような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 }
useExisting
をuseClass
に置き換えると、新しいクラスインスタンスが登録されます。
通常、プロバイダーごとにインスタンスを取得します。
{provide: Class1, useClass: Class1},
と同じです
Class1
と
{provide: Class1, useClass: Class3},
コンストラクターがClass1
Angular DIを要求すると、Class3
のインスタンスが作成され、それがコンストラクターに渡されるように構成できます。
{provide: Class2, useExisting: Class2}
インスタンスが作成されることはありませんが、エイリアスではなくこれが表示されます。コンストラクターがClass2
を要求した場合、Angular DIはキーClass2
の別のプロバイダーを探し、このClass2
プロバイダーからインスタンスを注入します。次のようなuseExisting
別のプロバイダーまたはエイリアスへの参照。