注入实现某些接口的所有服务
Inject all Services that implement some Interface
简单场景:
我有多个实现通用接口的服务。所有这些服务都在 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());
}
}
这有可能吗?
您需要像这样注册您的服务提供商:
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());
}
}
有关详细信息,请参阅此插件:https://plnkr.co/edit/HSqOEN?p=preview。
有关详细信息,请参阅此 link:
由于接口在运行时不可用(仅用于静态检查)接口不能用作DI的toke。
改用令牌:
(已弃用)
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());
}
}
简单场景:
我有多个实现通用接口的服务。所有这些服务都在 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());
}
}
这有可能吗?
您需要像这样注册您的服务提供商:
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());
}
}
有关详细信息,请参阅此插件:https://plnkr.co/edit/HSqOEN?p=preview。
有关详细信息,请参阅此 link:
由于接口在运行时不可用(仅用于静态检查)接口不能用作DI的toke。
改用令牌:
(已弃用)
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());
}
}