我有一个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 serve
和ng serve --aot
的行为不同。
我怎样才能做到这一点?我知道我可以使用FactoryProvider
,但是我必须复制服务依赖项(FactoryProvider
上的工厂函数和deps属性的参数。)
答案 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(不过你的班级名称)。