6

TL;DR 25.10.16: 更新

私はまだ正しい解決策について心配しているので、より明確にするためにタイトルの名前を変更しました.

与えられたモジュール

@NgModule({
  imports: [
    ExternalModule.forRoot(config),
  ],
  providers: [EXTERNAL_PROVIDERS(config)],
})
export class MyModule{}

私の質問は次のとおりです。このように渡された構成で依存関係を注入できる可能性はありますか?

  1. ExternalModule.forRoot(@Inject(MyConfig) config : MyConfig)
  2. providers: [EXTERNAL_PROVIDERS(@Inject(MyConfig) config)] (

{provide: xxx, deps :[xxx], useFactory : xxx}特定の外部プロバイダーごとに作成したくありません。

hereApplication Wide Service Locatorで説明されているように、ルート インジェクターにアクセスしてa を初期化しようとしましたが、Angular 2.1.0では期待どおりに動作しません。ngDoBootstrap

----------

古い投稿:

Angular2 で外部のサード パーティ ライブラリ プロバイダーを構成するための正しいパターンを知りたいです。

例を見てみましょう (Typescript のコード サンプル):

プロバイダーを公開し、configオブジェクト リテラルによっていくつかの構成オプションを提供するライブラリがあります。

export function THIRD_PARTY_PROVIDERS(config = {}): Provider[] {
  return [
    {
      provide: ExtConfigurableService,
      deps: [Http],
      useFactory: (http: Http) => {
        return new ExtConfigurableService(http, config);
      }
    },
    ExtOtherService
  ];
}

次に、クライアント側で、これらのプロバイダーを以下に含めることができます@NgModule

@NgModule({
  providers: [
    THIRD_PARTY_PROVIDERS({foo : 'bar'})
  ],
})
export class ClientModule { }

しかし、構成オブジェクト自体が のような既存のサービスに依存している場合はどうなるMyServiceでしょうか? providers 配列に依存関係を挿入できません。私の観点からの唯一の方法は、FactoryProviderを使用することです:

const myConfigProvider = {
    provide: MyConfig,
    deps: [MyService],
    useFactory: (MyService) => {
      return new MyConfig(MyService);
    }
  };

MyConfigそれを考えると、どうすればに注入できTHIRD_PARTY_PROVIDERSますか?


私が思いついた唯一の解決策は満足のいくものではありません:

  1. OpaqueTokenここのようなサードパーティプロバイダー側​​からエクスポートされたの使用(Angular 2 Router)
  2. クライアント側からすべてのプロバイダー manuallay を構成する

1 つ目は、サード パーティ プロバイダーからのみ実行できます。トークンをエクスポートし、そのトークンをファクトリ プロバイダーの独自の依存関係として要求します。

2 つ目は、サードパーティ ライブラリの実装の詳細やサービスを自分で把握して構成する必要があるため、非常に見苦しいものです。

@NgModule({
      providers: [
        {provide: ExtConfigurableService, deps: [MyConfig], useFactory: ...},
        ExtOtherService
      ],
    })
    export class ClientModule { }

angular 2 (クライアントおよびサードパーティプロバイダー側​​) で推奨されるパターンは何ですか?


アップデート 19.10.16

ソリューションの最初の提案を実装しましたが、うまくいきました。ただし、外部ライブラリを制御するか、変更についてプロジェクト所有者に同意するか、レポをフォークする必要があります。

サードパーティの lib.ts:

   export const JWT_CONFIGURATION = new OpaqueToken('THIRD_PARTY_PROVIDER_TOKEN');
    ...

    @Injectable()
    export class ExtConfigurableService {

      constructor(@Inject(JWT_CONFIGURATION) config: any) {
        // do someting with client provided config 
      }

my-module.ts

 @NgModule({
      providers: [
        {
        provide: JWT_CONFIGURATION,
        deps: [MyService],
        useFactory: (mySvc: MyService) => {
          return {foo : 'bar'};
        }, THIRD_PARTY_PROVIDERS
      ]
    })
    export class MyModule { }

しかし、外部ライブラリが構成を引数として渡す必要がある場合 (上の例のように)、myconfig をそれに挿入する方法はまだわかりません。

@Inject()コンストラクターまたはファクトリープロバイダーに加えて、Angular 2 に依存関係を注入する他の方法はありますか?

4

0 に答える 0