angular - 根据运行时标志提供 API 或模拟版本

标签 angular typescript

我想提供基于运行时标志的 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/

相关文章:

angular - ngrx/router-store 4 可以与 ngrx-store 2.2 一起使用吗?

angular - 带有 angular2-highcharts 的实时图表

angular - VS 代码- Angular : Experimental support for decorators Warning

typescript - 如何在 typescript 界面中表示变量键名?

javascript - ChartJS v3 与 TypeScript 和 Webpack 的使用

angular - 模块 'DecoratorFactory' 导入的意外值 'DynamicTestModule' - karma-jasmine

javascript - 如何在 Angular 中为 app.modules.ts 加载环境数据

Angular 2 提供的参数与调用目标(spec.ts)的任何签名都不匹配

javascript - 如何传递数字 id 而不是字符串 id?

javascript - 未触发可观察的 next() 回调