15

簡単なシナリオ:

共通のインターフェイスを実装する複数のサービスがあります。これらのサービスはすべてbootstrapメソッド内に登録されます。

ここで、共通のインターフェイスを実装するすべての登録済みサービスを注入する別のサービスが必要です。

すなわち

export interface MyInterface {
    foo(): void;
}

export class Service1 implements MyInterface {
    foo() { console.out("bar"); }
}

export class Service2 implements MyInterface {
    foo() { console.out("baz"); }
}

export class CollectorService {
    constructor(services:MyInterface[]) {
        services.forEach(s => s.foo());
    }
}

それはどういうわけか可能ですか?

4

2 に答える 2

16

次のようにサービス プロバイダーを登録する必要があります。

boostrap(AppComponent, [
  provide(MyInterface, { useClass: Service1, multi:true });
  provide(MyInterface, { useClass: Service2, multi:true });
]);

インターフェイスは実行時に存在しないため、これはインターフェイスを持たないクラスでのみ機能します。

インターフェイスで動作させるには、適応させる必要があります。

bootstrap(AppComponent, [
  provide('MyInterface', { useClass: Service1, multi:true }),
  provide('MyInterface', { useClass: Service2, multi:true }),
  CollectorService
]);

そしてこの方法で注入します:

@Injectable()
export class CollectorService {
  constructor(@Inject('MyInterface') services:MyInterface[]) {
    services.forEach(s => s.foo());
  }
}

詳細については、この plunkr を参照してください: https://plnkr.co/edit/HSqOEN?p=preview .

詳細については、次のリンクを参照してください。

于 2016-03-10T12:34:21.450 に答える
8

インターフェイスは実行時に使用できないため (静的チェックの場合のみ)、インターフェイスを DI のトークンとして使用することはできません。

代わりにトークンを使用します。

(非推奨) https://angular.io/api/core/OpaqueToken

var myInterfaceToken = new OpaqueToken('MyInterface');

https://angular.io/api/core/InjectionToken

var myInterfaceToken new InjectionToken<MyInterface>('MyInterface');
// import `myInterfaceToken` to make it available in this file

@NgModule({
  providers: [ 
    { provide: myInterfaceToken, useClass: Service1, multi:true },
    { provide: myInterfaceToken, useClass: Service2, multi:true },
  ],
  boostrap: [AppComponent],
)
class AppComponent {}
// import `myInterfaceToken` to make it available in this file

export class CollectorService {
    constructor(@Inject(myInterfaceToken) services:MyInterface[]) {
        services.forEach(s => s.foo());
    }
}
于 2016-03-10T12:40:33.350 に答える