angular - 有没有办法在 AppModule 的提供者中动态设置模拟服务?
问题描述
我的 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 },
...
] : []
),
...
解决方案
你可以用它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]},
...
]
推荐阅读
- javascript - Plotly.js:隐藏热图轴和图例
- .htaccess - 如何 301 将特定 URL 的 http:// 重定向到 https://(非典型示例)
- python - 在 python 的行为中迭代一个目录
- variables - 在 Hive 脚本中设置动态日期变量
- android - 从 android 手机上的 android studio 运行后,应用程序只是打开和关闭
- python - 如何根据模块路径在python包中创建文件?
- javascript - for 循环中的 getElementById 仅显示第一项
- identityserver4 - IdentityServer4 在身份验证后添加租户声明
- php - Moodle REST API 间歇性失败并返回 500(内部服务器错误)
- javascript - 有没有一种方法可以抓取选项标签之间的任何内容?