使用相同服务的多个实例

Dev*_*aro 22 angular2-services angular

我有一个服务,像这样:

@Injectable()
export class EditorService { ... }
Run Code Online (Sandbox Code Playgroud)

我有一个组件,像这样:

@Component({
    ...
    template: `<child-component></child-component>`,
    providers: [EditorService],
    ...
})
export class SomeComponent {
    constructor(
        private _appleEditorService: EditorService,
        private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,此组件具有子组件:

@Component({
    ...
    selector: 'child-component',
    ...
})
export class ChildComponent {
    constructor(
        private _appleEditorService: EditorService,
        private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我想要两个我的实例EditorService:一个用于编辑苹果,一个用于编辑梨.但是,上面的代码不起作用,因为Angular无法知道哪个实例的EditorService变量名是私有的._pearEditorServiceChildComponent还不如指同一个实例_appleEditorServiceSomeComponent.

问题:那么,我可以两次使用相同的Angular2服务吗?

编辑:我的问题的关键是如果可以使用相同的类.我知道有一些解决方法是为服务的每个实例创建一个单独的类,甚至通过继承实现少量代码.我只是想知道是否可以不用.

Gün*_*uer 44

Angular DI为每个提供者维护一个实例.在您的情况下,如果您有两个具有相同类型的构造函数参数,则它们将解析为同一实例.

你可以做的是提供一个工厂功能(不同于一个简单的useFactory提供者事件,虽然它也使用它)

(从/sf/answers/2626230281/复制的示例)

{ 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);
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个固定数量的实例,这应该工作:

{ provide: 'instance1', useClass: EditorService },
{ provide: 'instance2', useClass: EditorService },
Run Code Online (Sandbox Code Playgroud)
export class SomeComponent {
    constructor(
        @Inject('instance1') private _appleEditorService: EditorService,
        @Inject('instance2') private _pearEditorService: EditorService) {}
}
Run Code Online (Sandbox Code Playgroud)