angular - 根据运行时标志提供 API 或模拟版本
问题描述
我想提供基于运行时标志的 API 接口的模拟或真实实现。这是我目前的方法:
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 返回类时实例化或提供类的正确方法是什么?或者,有没有更简单的方法来覆盖提供者?
解决方案
您提供了一个工厂,因此您不能简单地将注入令牌作为工厂结果传递。mockMyApi
是一个常数,MyApi
而是一个类。因此,您需要创建该类的对象。这是工厂通常使用的。用于deps
传递依赖关系,例如HttpClient
:
providers:[{
provide: MyApi,
useFactory: (http: HttpClient) => {
return env.useSpoofData ? mockMyApi : new MyApi(/* args, e.g. http */)
},
deps: [HttpClient]
}]