Angular 2+ 服务何时提供

Posted

技术标签:

【中文标题】Angular 2+ 服务何时提供【英文标题】:When does the Angular 2+ service get provided 【发布时间】:2018-12-14 03:25:39 【问题描述】:

我已经阅读了很多关于 Angular 依赖注入系统的内容,但似乎仍然无法找到一个非常具体的问题的答案。

通过@Moduleproviders: [] 数组注册的提供程序被模块的当前(最近的父级)注入器“拾取”。它们通常会在根注入器中注册,除非模块是延迟加载的,它会创建一个单独的注入上下文,其工作方式类似于 块(外部提供程序可在内部访问,反之亦然,内部提供程序优先) .如果提供程序注册在@Componentproviders: [] 数组中,它们也会被注入到单独的上下文中,该上下文仅包括组件本身及其子组件。

然而,@Service() 装饰器中注册的服务会发生什么对我来说是个谜。如果该服务从未在任何地方使用过怎么办?或者如果@Service(providedIn: root) 仅用于延迟加载模块怎么办?如果是providedIn: SomeLazyLoadedModule 呢?模块的providers 数组中是否应该提及此类服务?

我能找到的关于该主题的唯一具体信息是“AOT 编译器可能会执行一些优化,例如摇树”,老实说,这并没有真正澄清很多。

如果上述某些陈述有误,请随时纠正我。

【问题讨论】:

【参考方案1】:

首先,没有@Service 装饰器。它被命名为@Injectable

如果您仅使用@Injectable() 来装饰服务,那么它不会在任何地方提供,除非您将其添加到模块或组件的providers 数组中。

如果你用@Injectable( providedIn: 'root' )装饰它,那么它是在根模块中提供的,即相当于将它添加到根模块的providers数组中除了这样可以完全忽略服务如果它从未注入任何地方,则不要将其添加到任何捆绑包中:在这种情况下,由于它不在任何其他 TypeScript 文件的导入中,它可以被摇树:没有使用该服务,因此捆绑它是无用的。

如果你用@Injectable( providedIn: SomeModule )装饰它,那么它是在模块SomeModule中提供的,即相当于将它添加到模块SomeModule的providers数组中,与上面相同的例外,即如果没有导入它,它可以是摇摇欲坠。

【讨论】:

谢谢,这很有帮助。尤其是在阅读了更多文档之后;)

以上是关于Angular 2+ 服务何时提供的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 测试 - 异步函数调用 - 何时使用

为啥以及何时使用 angular.copy? (深拷贝)

在 Angular 应用程序中抛出错误

何时在 TypeScript / Angular 中使用接口和模型

如何使用亚马逊 s3 提供 Angular 2

Angular:关于何时制作自定义管道与组件的规则