如果跨使用不同类型的组件构造函数调用,Angular 是否会注入(inject)多个通用服务实例?
我有很多服务将为所有继承自同一基类的不同类提供相同的功能。我想使用 Typescript 的通用模式 MyService<T extends BaseClass>
来处理这个。
但我不知道它如何与 Angular 的注入(inject)器配合使用:
- 如果将此服务注入(inject)到具有不同类型的不同组件中,Angular 注入(inject)器是否会创建该服务的多个实例?
- 如果使用相同的类型调用,注入(inject)器是否会注入(inject)相同的实例?
代码:
@Injectable
export class MyService<T> {
...
}
@Component
export class ComponentA {
constructor(alphaService MyService<Alpha>) {} <--Instance 1
}
@Component
export class ComponentB {
constructor(betaService MyService<Beta>) {} <----Instance 2?
}
@Component
export class ComponentA1 {
constructor(alphaService MyService<Alpha>) {} <---Instance 1?
}
这合法吗?注入(inject)器是否知道创建两个 MyService 实例?
最佳答案
这是一个简单的解决方案:
// service and models
export class User {
firstName: string
}
export class Admin {
lastName: string
}
@Injectable()
export class GenericService<T>{
item: number = Math.random();
GetAll(): Array<T> {
let output = [];
console.log(this.item); // each instance has own value
return output;
}
}
然后通过useFactory在模块中设置你的服务:
providers: [
{ provide: 'UserService', useFactory: () => (new GenericService<User>()) },
{ provide: 'AdminService', useFactory: () => (new GenericService<Admin>()) },
],
并使用@Inject 装饰器注入(inject)您的服务:
constructor(
@Inject('UserService') private userService: GenericService<User>,
@Inject('AdminService') private adminService: GenericService<Admin>
) { }
记住最好使用InjectionToken (OpaqueToken 已弃用)用于您的提供商 token 。我使用字符串只是为了简单起见。
关于angular - 在 Angular 中注入(inject)通用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555744/