具有AOT的类型提供者中的角度条件

时间:2018-02-21 14:44:25

标签: javascript angular typescript decorator angular2-aot

我有一个Angular项目,我用AOT编译。我希望能够注册根据配置动态解析的ClassProvider。我使用的简化代码是:

const isMock = Math.random() > 0.5;

@NgModule({
  // ...
  providers: [
    { provide: MyServiceBase, useClass: (isMock) ? MyServiceMock : MyService },
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

问题是当我用AOT编译它时,我总是得到相同的服务。我希望在击中F5时获得不同的服务(因为第一行的randomness)。在没有AOT的情况下进行编译时,它的行为与我期望的一样。

以下是github上的整个代码示例:https://github.com/vdolek/angular-test/tree/aot-conditioned-provider-problem。它与ng serveng serve --aot的行为不同。

我怎样才能做到这一点?我知道我可以使用FactoryProvider,但是我必须复制服务依赖项(FactoryProvider上的工厂函数和deps属性的参数。)

1 个答案:

答案 0 :(得分:1)

我认为@ jeanpaul-a说你除了使用工厂之外别无选择。但是管理依赖关系可能不是很干净。但你可以使用的是Injector。我会选择类似的东西:

@NgModule({
  imports:      [ BrowserModule, FormsModule ],
  declarations: [ AppComponent, HelloComponent ],
  providers: [
    Dep1Service,
    Dep2Service,
    { provide: MyServiceBase, useFactory: createService, deps: [Injector] }
  ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

export function createService(injector: Injector) {
  const isMock = Math.random() > 0.5;
  if (mock) {
    return new MyService1(injector.get(Dep2Service));
  } else {
    return new MyService2(injector.get(Dep1Service));
  }
}

您还可以将MyServiceBase设置为接口并使用InjectionToken。 你会找到一个有效的例子here(不过你的班级名称)。