Angular2 How can I Inject all interface implementa

2019-06-20 17:10发布

I'm learning Angular2 with Typescript and I have a problem.

I have two classe that imprements same interface. How can I inject them to a service as a list ?

I read about opaquetoken https://angular.io/docs/ts/latest/guide/dependency-injection.html#opaquetoken

But I don't know if I need to use it and how to use it.

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));
  }

}

Thanks for any help !

1条回答
放荡不羁爱自由
2楼-- · 2019-06-20 17:45

You need to either add the array as a provider, or use multi: true in the provider configuration.

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

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

Or

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

The second one is probably preferable, as you let Angular create them, allowing them to be injected with their own dependencies if needed.

Then you just need to use the CHECKERS token when you inject

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

constructor(@Inject(CHECKERS) private checkers: CheckerInterface[]) { 
查看更多
登录 后发表回答