我想提供基于运行时标志的 API 接口(interface)的模拟或真实实现。这是我目前的做法:
providers:[{
provide: MyApi,
useFactory: () => {
return env.useSpoofData ? mockMyApi : MyApi
}
}]
我将 mockMyApi
定义为:
export const mockMyApi: MyApi = {
get(): Observable<MyResponse> {
const resp: MyResponse = {items};
return observableOf(resp);
},
};
此模拟版本有效,但以这种方式提供的真实版本无效。 (但是,如果我根本不覆盖此提供程序,则真实版本有效)
我已经尝试了两种方法来解析“真实”实现的符号。
一:
provide: MyApi,
deps: [MyApi],
useFactory: (real: MyApi) => env.spoof ? mockMyApi : real;
失败。构建时的循环依赖。
两个:
provide: MyApi,
deps: [Injector],
useFactory: (inj: Injector) => env.spoof ? mockMyApi : inj.get(MyApi);
失败。运行时堆栈溢出。
从 useFactory 返回类时,实例化或提供类的正确方法是什么?或者,是否有更简单的方法来覆盖提供程序?
最佳答案
你提供了一个工厂,所以你不能简单地将注入(inject) token 作为工厂结果传递。 mockMyApi
是一个常量,而 MyApi
是一个类。因此,您需要创建该类的一个对象。这就是工厂通常的用途。使用 deps
传递依赖关系,例如HttpClient
:
providers:[{
provide: MyApi,
useFactory: (http: HttpClient) => {
return env.useSpoofData ? mockMyApi : new MyApi(/* args, e.g. http */)
},
deps: [HttpClient]
}]
关于angular - 根据运行时标志提供 API 或模拟版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52375092/