我们应该如何把服务的范围限制到模块中?

发布于 2025-01-11 23:21:25 字数 1110 浏览 11 评论 0

如果一个模块在应用程序启动时就加载,它的 @NgModule.providers 具有 全应用级作用域 。 它们也可用于整个应用的注入中。

导入的提供商很容易被由其它导入模块中的提供商替换掉。 虽然设计如此,但是也可能引起意料之外的结果。

作为一个通用的规则,应该 只导入一次 带提供商的模块,最好在应用的 根模块 中。 那里也是配置、包装和改写这些服务的最佳位置。

假设模块需要一个定制过的 HttpBackend ,它为所有的 Http 请求添加一个特别的请求头。 如果应用中其它地方的另一个模块也定制了 HttpBackend 或仅仅导入了 HttpModule ,它就会改写当前模块的 HttpBackend 提供商,丢掉了这个特别的请求头。 这样服务器就会拒绝来自该模块的请求。

要消除这个问题,就只能在应用的根模块 AppModule 中导入 HttpModule

只要有可能,就让模块惰性加载。Angular 为惰性加载模块提供了独立的子注入器。该模块中的提供商只对由该注入器创建的组件树可见。

继续看了例子,假设某个模块的组件真的需要一个私有的、自定义的 HttpBackend

那就创建一个 "顶级组件" 来扮演该模块中所有组件的根。把这个自定义的 HttpBackend 提供商添加到这个顶级组件的 providers 列表中,而不是该模块的 providers 中。回忆一下,Angular 会为每个组件实例创建一个子注入器,并使用组件自己的 providers 来配置这个注入器。

当该组件的子组件需要一个 HttpBackend 服务时,Angular 会提供一个局部的 HttpBackend 服务,而不是应用根注入器创建的那个服务。此时,子组件将正确发起 http 请求,而不管其它模块对 HttpBackend 做了什么?同时需要确保模块中的组件都创建成这个顶级组件的子组件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

攒眉千度

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文