Angular 注入实现某些接口的所有服务

Angular 注入实现某些接口的所有服务,angular,angular2-services,Angular,Angular2 Services,简单场景: 我有多个实现公共接口的服务。所有这些服务都在bootstrap方法中注册 现在我想要另一个服务,它注入实现公共接口的所有注册服务 i、 e 这可能吗?您需要像这样注册服务提供商: boostrap(AppComponent, [ provide(MyInterface, { useClass: Service1, multi:true }); provide(MyInterface, { useClass: Service2, multi:true }); ]); 这只适用

简单场景:

我有多个实现公共接口的服务。所有这些服务都在
bootstrap
方法中注册

现在我想要另一个服务,它注入实现公共接口的所有注册服务

i、 e


这可能吗?

您需要像这样注册服务提供商:

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:

有关更多详细信息,请参阅此链接:


由于接口在运行时不可用(仅用于静态检查),因此接口不能用作DI的toke

改为使用令牌:

(已弃用)

var myInterfaceToken=新的OpaqueToken('MyInterface');

var myInterfaceToken新注入令牌(“MyInterface”);
//导入'myInterfaceToken',使其在此文件中可用
@NGD模块({
提供者:[
{provide:myInterfaceToken,useClass:Service1,multi:true},
{provide:myInterfaceToken,useClass:Service2,multi:true},
],
boostrap:[AppComponent],
)
类AppComponent{}
//导入'myInterfaceToken',使其在此文件中可用
导出类收集器服务{
构造函数(@Inject(myInterfaceToken)服务:MyInterface[]){
services.forEach(s=>s.foo());
}
}

使用OpaqueToken是提供接口实现的推荐方式。自上次使用以来,使用了
InjectionToken
而不是
OpaqueToken
。自angular 4以来,我就不推荐使用此答案。使用此答案和的混合,我成功地实现了。感谢!此答案:提供程序语法已更改为类似以下内容:
{provide:MY_CLASS_INJECTION_TOKEN,useClass:MY_CLASS,multi:true}
并被添加到启动模块(至少我将其添加到启动模块…@MartinJH很高兴听到!感谢您的提示。这是一个非常古老的答案。我更新了它。这是一个快速的响应。感谢您的努力!使用OpaqueToken,请查看正确的答案
@Injectable()
export class CollectorService {
  constructor(@Inject('MyInterface') services:MyInterface[]) {
    services.forEach(s => s.foo());
  }
}