我的AppModule定义非常简单。我的提供程序中有一组模拟服务,这些服务利用本地数据直到我的端点可以解决。当服务端点站起来时,我正在慢慢地迁移它们。问题在于该应用程序非常需要一些配置才能使端点启动并运行,因此我创建了一个简单的配置文件,该文件创建了一个属性:useMockedServices
供想要使用演示的人使用。
{
useMockedServices: true
}
但是,我的问题是。如何为提供商考虑此配置?
...
providers: [
{provide: UserService, useClass: MockUserService},
...
],
...
我可以这样做吗?
providers: [
{ provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { hasBackdrop: false }},
...
].concat( config.useMockedServices ? [
{provide: UserSerice, useValue: MockUserService},
...
]: [],
我只是尝试这样做,但是却收到一个错误:没有重载匹配此调用,并显示“属性切片的类型不兼容”
providers: [
// Default Options for using Modals / Dialogs.
{ provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: { hasBackdrop: false } },
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
{ provide: AuthGuard, useClass: AuthGuard },
{ provide: AuthenticationService, useClass: AuthenticationService }
].concat(
configuration.useMockServices === true ? [
{ provide: UserService, useClass: MockUserService },
...
] : []
),
...
答案 0 :(得分:1)
您可以使用useFactory
来做到这一点:
function userServiceFactory() {
return enviroment.useMockedServices ? UserServiceMock : UserService;
}
...
providers: [
{provide: UserService, useFactory: userServiceFactory},
...
]
或者如果您可以使用配置。
function userServiceFactory(config: ConfigService) {
return config.useMockedServices ? UserServiceMock : UserService;
}
...
providers: [
{provide: UserService, useFactory: userServiceFactory, deps:[ConfigService]},
...
]