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:
有关更多详细信息,请参阅此链接:
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());
}
}