Angular2如何将所有接口实现注入服务列表?

时间:2017-03-27 14:48:50

标签: angular typescript dependency-injection

我正在使用Typescript学习Angular2,但我遇到了问题。

我有两个相同界面的classe。如何将它们作为列表注入服务?

我读过opaquetoken https://angular.io/docs/ts/latest/guide/dependency-injection.html#opaquetoken

但我不知道我是否需要使用它以及如何使用它。

export interface CheckerInterface {
    check(text : string) : boolean
}

export class Checker1 implements CheckerInterface {
    check(text : string) : boolean {
    //do something 
    return true;
}

export class Checker2 implements CheckerInterface {
    check(text : string) : boolean {
    //do something 
    return true;
}

@Injectable()
export class Service {

  constructor(private checkers: CheckerInterface[]) {  //??
      checkers.foreach( checker => checker.check(somestring));
  }

}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要将数组添加为提供程序,或在multi: true配置中使用provider

export const CHECKERS = new OpaqueToken('one');

@NgModule({
  providers: [
     { provide: CHECKERS, useValue: [new Checker1(), new Checker2()] },
  ]
})

@NgModule({
  providers: [
     { provide: CHECKERS, useClass: Checker1, multi: true },
     { provide: CHECKERS, useClass: Checker2, multi: true },
  ]
})

第二个可能更好,因为你让Angular创建它们,如果需要的话允许它们注入自己的依赖项。

然后,您只需在注入时使用CHECKERS令牌

import { Inject } from '@angular/core';
import { CHECKERS } from './wherever';

constructor(@Inject(CHECKERS) private checkers: CheckerInterface[]) {