我有这样的服务:
@Injectable()
export class EditorService { ... }
我有一个组件,像这样:
@Component({
...
template: `<child-component></child-component>`,
providers: [EditorService],
...
})
export class SomeComponent {
constructor(
private _appleEditorService: EditorService,
private _pearEditorService: EditorService) {}
}
您可能已经注意到,该组件有一个子组件:
@Component({
...
selector: 'child-component',
...
})
export class ChildComponent {
constructor(
private _appleEditorService: EditorService,
private _pearEditorService: EditorService) {}
}
如您所见,我需要 EditorService
的两个实例:一个用于编辑苹果,一个用于编辑梨。然而,上面的代码是行不通的,因为 Angular 无法知道哪个 EditorService
实例是哪个实例,因为它们的变量名是私有(private)的。 ChildComponent
中的 _pearEditorService
可能指的是与 SomeComponent
中的 _appleEditorService
相同的实例。
问题:否则,我可以使用同一个 Angular2 服务两次吗?
编辑: 我的问题是是否可以使用相同的类。我知道有一些解决方法,可以为服务的每个实例实际创建一个单独的类,甚至可以通过继承用很少的代码来做到这一点。我只是想知道如果没有它是否可以完成。
最佳答案
Angular DI 为每个提供者维护一个实例。在您的情况下,如果您有两个具有相同类型的构造函数参数,它们将解析为相同的实例。
你可以做的是提供一个工厂函数(不同于简单的 useFactory
提供者事件,尽管它也使用它)
(示例复制自 https://stackoverflow.com/a/37517575/217408 )
{ provide: EditorService, useFactory:
(dep1, dep2) => {
return (x) => {
new EditorService(x, dep1, dep2);
}
}, deps: [Dep1, Dep2]
})
....
constructor(@Inject(EditorService) editorServiceFactory: any) {
let editorService1 = editorServiceFactory(1);
let editorService2 = editorServiceFactory(2);
}
如果您有固定数量的实例,这应该可行:
{ provide: 'instance1', useClass: EditorService },
{ provide: 'instance2', useClass: EditorService },
export class SomeComponent {
constructor(
@Inject('instance1') private _appleEditorService: EditorService,
@Inject('instance2') private _pearEditorService: EditorService) {}
}
关于angular - 使用同一服务的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482357/