0

我需要实现一些功能。我想在模块 A 和 B 中提供一些 http 拦截器。我希望从模块 A 发送的每个 http 请求都带有一些标头,例如“zone: a-feature”。来自模块 B 的任何请求都必须使用诸如“zone: b-feature”之类的标头发送。

我正在尝试使用自定义 http 拦截器来实现这一点。

这是我尝试过的:https ://stackblitz.com/edit/angular-j3siwz

  1. 我用 2 个组件 A 和 B 创建了 2 个模块
  2. 每个组件发送请求
  3. 每个模块都有自定义的 TOKEN 提供者
  4. 在 http 拦截器中,我想注入令牌提供程序。

问题是角度是如何工作的 :) 看起来,按照设计,所有依赖项都在某些“根模块”中提供。因此,当我在 B 模块中提供“另一个”令牌时,我只需在根模块注入器中重写此令牌。

因此,在我的两个请求的示例中,我在控制台日志中都收到了“a-feature”消息。拦截器仅使用 1 个令牌值创建一次(下面的文章准确描述了行为为何如此)。

看起来角度文档清楚地说明了这一点:https ://angular.io/guide/dependency-injection

我还发现并红色了这篇完美的文章:https ://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d 。

看起来,延迟加载模块的工作方式不同。但在我的情况下,我没有延迟加载,所以我不能在我的情况下使用这个完美的功能。

所以,我的问题是如何在那个复杂的世界中实现我需要的功能?

我不知道该怎么做。我也尝试过:提供不同的拦截器,装饰 HttpClient,使用工厂和其他东西。他们中的任何一个都给了我相同的结果。

升级版:

我也了解multi提供者对象中的属性。通过这个我可以获得所有模块中提供的所有令牌,但我没有看到完整的解决方案。我如何能够检测到该数组中的确切令牌应该应用于特定的 http 请求(它可以来自任何模块)?

4

1 回答 1

1

您是否尝试过“providedIn:MyModule”语法?

来自角源:

export interface Injectable {
  /**
   * Determines which injectors will provide the injectable,
   * by either associating it with an `@NgModule` or other `InjectorType`,
   * or by specifying that this injectable should be provided in one of the following injectors:
   * - 'root' : The application-level injector in most apps.
   * - 'platform' : A special singleton platform injector shared by all
   * applications on the page.
   * - 'any' : Provides a unique instance in every module (including lazy modules) that injects the
   * token.
   *
   */
  providedIn?: Type<any>|'root'|'platform'|'any'|null;
}
于 2020-04-09T13:33:29.343 回答