angular - 在 Angular 中注入(inject)通用服务

标签 angular

如果跨使用不同类型的组件构造函数调用,Angular 是否会注入(inject)多个通用服务实例?

我有很多服务将为所有继承自同一基类的不同类提供相同的功能。我想使用 Typescript 的通用模式 MyService<T extends BaseClass>来处理这个。

但我不知道它如何与 Angular 的注入(inject)器配合使用:

  1. 如果将此服务注入(inject)到具有不同类型的不同组件中,Angular 注入(inject)器是否会创建该服务的多个实例
  2. 如果使用相同的类型调用,注入(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/

相关文章:

javascript - NX 工作区,如何使用 cli 更改 Angular 应用程序名称?

angular - 获取 boolean 选项值

Java : Cannot send POST request to backend with Angular 5

angular - Angular 6 中的 owl-date-time 选择器从输入中删除时间

javascript - 用 Angular Testing 服务的理想方法是什么?

Angular 8 : "Schematic "interceptor"not found in collection"error while generating interceptor in Angular cli

node.js - 无法从 Ionic 应用程序发布 HTTP 请求

javascript - Angular 2 中的 Trevor JS 爵士

node.js - Mongoose Middleware pre 'remove' 不起作用,Model.update 不是函数

javascript - 我的 Angular 2 对象打印在控制台上,但单个属性没有从模板打印