我需要实现一些功能。我想在模块 A 和 B 中提供一些 http 拦截器。我希望从模块 A 发送的每个 http 请求都带有一些标头,例如“zone: a-feature”。来自模块 B 的任何请求都必须使用诸如“zone: b-feature”之类的标头发送。
我正在尝试使用自定义 http 拦截器来实现这一点。
这是我尝试过的:https ://stackblitz.com/edit/angular-j3siwz
- 我用 2 个组件 A 和 B 创建了 2 个模块
- 每个组件发送请求
- 每个模块都有自定义的 TOKEN 提供者
- 在 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 请求(它可以来自任何模块)?