我无法理解如何在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())
}
}
输出:
鲍勃在说话!
艾米在说话!
乔在说话!
答案 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。