我需要实现一些功能。我想在模块A和B中提供一些HTTP拦截器。我希望模块A的每个HTTP请求都带有一些标头,例如“ zone:a-feature”。来自模块B的任何请求都必须带有标头,例如“ zone:b-feature”。
我正在尝试使用自定义的HTTP拦截器实现这一点。
这是我尝试过的:https://stackblitz.com/edit/angular-j3siwz
问题是angular的工作原理:)看起来,通过设计,所有依赖项都在某个“根模块”中提供。因此,当我在B模块中提供“另一个”令牌时,只需在根模块注入器中重写此令牌。
因此,在我的两个请求示例中,我都在控制台日志中收到“ a-feature”消息。拦截器仅用1个令牌值创建一次(下面的文章确切描述了为什么如此)。
看起来像有角度的文档清楚地这样说:https://angular.io/guide/dependency-injection
我还发现并充实了这篇完美的文章:https://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d。
看起来,延迟加载的模块工作方式不同。但就我而言,我没有延迟加载,因此无法在我的情况下使用此完美功能。
所以,我的问题是如何在那个复杂的世界中实现我所需要的功能?
我不知道该怎么做。我也尝试过:提供不同的拦截器,使用工厂和其他东西装饰HttpClient。他们中的任何一个都给我相同的结果。
UPD:
我也理解提供程序对象中的multi
属性。这样,我可以获得所有模块中提供的所有令牌,但看不到完整的解决方案。我如何能够检测到该数组中的确切令牌应应用于特定的http请求(可以来自任何模块)?
答案 0 :(得分:0)
您尝试使用“ providedIn:MyModule”语法吗?
来自Angular来源:
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;
}