有没有一种方法可以在AppModule的提供程序中动态设置模拟服务?

时间:2019-10-11 21:09:41

标签: angular typescript

我的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 },
    ...
    ] : []
  ),
...

1 个答案:

答案 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]},
  ...
]