angular - 如何动态更改 Angular 服务实现?

标签 angular dependency-injection

我是 Angular2 的新手,我有两个服务 DefaultServiceSpecialService应该根据组件状态交替使用 我不知道我是否可以将单例注入(inject)到我的组件中 GeneralService以某种方式表现得像DefaultServiceSpecialService通过改变它的实现。

我有另一个想法在 generalService 中注入(inject)这两个服务并将它们的方法委托(delegate)给适当的服务。

感谢告诉我如何实现第一个想法(如果可行),或者建议我其他想法。

@Component({
  selector: 'my-app',
   templateUrl : './content.component.html'
})
export class AppComponent  { 
constructor(generalService : GenralService,injector : Injectot){}
@ViewChild(MySon)
    private mySon : MySon;
    state : State;

    onChangeState(newState : State):void{
        if(state = special)
        //this.generalService = this.injector.get('SpecialService');
        myson.updateplease();
    }
}

假设SpecialServiceDefaultService延伸GeneralService

最佳答案

您的第一个想法是完全可能的(如果我理解正确的话)。这个想法是将 GeneralService 创建为一个接口(interface),然后创建两个从该接口(interface)继承并实现其功能的服务。然后,通过 injector,您可以获得对您想要的那个的引用。

看看这个 plunker:http://plnkr.co/edit/rjghCDkc5jUjp1SSpjDK

只需将此处的 false 更改为 true 即可:

if (false)
{
  this.service = this.injector.get(SpecialService);
}
else
{
  this.service = this.injector.get(DefaultService);
}

查看“控制台”中记录的值是否发生变化。我将初始化放在 ngOnInit 中,但您可以在任何地方进行初始化 ;-)

关于angular - 如何动态更改 Angular 服务实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698697/

相关文章:

angular - 在 IIS 的虚拟目录下运行 Angular

angular - 试图理解 RxJS 导入

Angular2 - 如何将服务注入(inject)自定义异常处理程序

c# - 依赖注入(inject)与分层架构

c# - 将 IsClosedTypeOf 从 autofac 转换为 simple.injector

java - 解耦项目引用和依赖注入(inject)

c# - [Inject] 出现问题,无法在 C# 类 (Blazor) 中工作

angular - 组件中的 rxjs 行为主题设置值

javascript - compileModuleAndAllComponentsAsync() 时没有提供程序 Angular2 - 2.0 最终版本

angular - HttpTestingController ExpectOne匹配URL错误