对多个实例使用角度服务vs导出类?

时间:2018-04-10 16:03:07

标签: angular service

我无法理解如何在Angular中处理多个服务实例。在下面的示例中,我想创建Person类型的多个实例。由于Person不是单身人士,我不会注射它。简单地将它作为Person类导入并跳过Angular方式会更有意义吗?

person.service.ts

@Injectable()
export class Person {
  constructor(private name: string) { }
  talk() {
    console.log(`${this.name} is talking!`)
  }

}

app.component.ts

 export class AppComponent {
 ngOnInit() {
   let a = ['Bob','Amy','Joe']
   let instances = a.map(rec=> new Person(rec))
   instances.forEach(person=> person.talk())
 }

}

输出:
鲍勃在说话! 艾米在说话! 乔在说话!

2 个答案:

答案 0 :(得分:0)

Angular注入器使用默认提供者类型(useClass)传播单例模式这一事实只是DI提供的一个好处。

如果它们不合适并且仍然使用DI,可以避免单身,至少出于测试原因:

providers: [{ provide: Person, useValue: Person }]

export class AppComponent {
 constructor(@Inject(Person) private Person: typeof Person) {}
 ngOnInit() {
   ...
   let instances = a.map(rec=> new this.Person(rec))
   ...
 }

否则,不能通过TestBed在测试中完全模拟类。目前Person构造函数不包含必须进行模拟的代码。

答案 1 :(得分:0)

在给出的示例中,Person是一种类型 - 而不是真正的服务。

如果Person类型是一个简单类型,比如说一个普通的旧JavaScript对象 - 我只会new它。一个很好的例子就是Ngrx个动作。这些只是简单的类型,不需要模拟测试 - 并且可以安全地进行新建。

如果这更复杂,你应该嘲笑它进行测试,请使用@estus answer。