首页 > 解决方案 > 根据运行时标志提供 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 返回类时实例化或提供类的正确方法是什么?或者,有没有更简单的方法来覆盖提供者?

标签: angulartypescript

解决方案


您提供了一个工厂,因此您不能简单地将注入令牌作为工厂结果传递。mockMyApi是一个常数,MyApi而是一个类。因此,您需要创建该类的对象。这是工厂通常使用的。用于deps传递依赖关系,例如HttpClient

providers:[{
  provide: MyApi,
  useFactory: (http: HttpClient) => {
     return env.useSpoofData ? mockMyApi : new MyApi(/* args, e.g. http */)
  },
  deps: [HttpClient]
}]

推荐阅读