前:
我有2项服务
1) one.service.ts
2) two.service.ts
我有一个组件 - dashboard.component.ts
import { Component, ViewEncapsulation, Inject } from '@angular/core';
import { OneService } from '../services/one.service';
import { TwoService } from '../services/two.service';
@Component({
selector: 'dashboard',
encapsulation: ViewEncapsulation.Emulated,
styleUrls: ['./dashboard.less'],
templateUrl: './dashboard.html'
})
export class DashboardComponent {
constructor() {
// Here how do I get service instance based on some this condition.
if(true) {
/* Service **one.service.ts** to be injected */
} else {
/* Service **two.service.ts** to be injected */
}
}
}
答案 0 :(得分:15)
您可以使用Injector
import { Injector } from '@angular/core'
...
constructor(private injector: Injector){
if(true) {
this.oneService = <OneService>this.injector.get(OneService);
} else {
this.twoService = <TwoService>this.injector.get(TwoService);
}
}
正如@MeirionHughes所提到的,这称为服务定位器模式:
该技术是服务定位器模式的一个示例。
除非你真的需要,否则避免这种技术。它鼓励像你在这里看到的粗心的抓包方法。很难解释,理解和测试。您无法通过检查构造函数来了解此类需要什么或将执行什么操作。它可以从任何祖先组件获取服务,而不仅仅是它自己的组件。你被迫对实现进行了解释,以发现它的作用。
框架开发人员在必须一般性地动态获取服务时可以采用这种方法。
来源:https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector
如上所述,您可以在其他服务中获取这些注入器,然后将此服务注入您的组件。