Angular 2 Lazy Module和Shared modules singleton

时间:2017-04-01 02:00:49

标签: angular

我正在使用this文章学习angular2的延迟加载和共享依赖项。我知道懒惰模块有一个单独的依赖树,它不与eager模块共享相同的服务实例。

当我从惰性模块的导入部分删除SharedModule导入时,行为发生了变化,我在eager和lazy模块之间获得了单例服务。

根据文档,为了重用相同的共享服务,还有更多工作要做,如this文章中所述。但我可以通过从共享模块定义中删除导入来使其工作。有人可以解释这种行为

以下是plnkr

EOF)

1 个答案:

答案 0 :(得分:8)

延迟加载并不会创建单独的依赖关系树 - 至少不会像你描述的那样。

正如您可能知道的那样,Angular的依赖注入系统实际上是一个注入器树 - 一个用于视图层次结构中的每个组件。当您请求依赖关系时,Angular会从请求依赖关系的组件开始遍历此注入器树,直到它找到能够提供该依赖关系的第一个注入器。 如果需要,这会为您提供强大的功能,因为在组件树的任何级别,您都可以为组件指定依赖关系的提供程序,并让该组件获得自己的依赖关系实例。此外,该组件的任何子节点也将共享相同的依赖实例。

这是分层依赖注入如何对组件起作用的基本概要。然而,当涉及到模块时,事情会有所不同。默认情况下,NgModule提供的任何依赖项都会添加到根注入器,这意味着整个应用程序将共享该依赖项的单个实例。例外情况是NgModule是否延迟加载。在这种情况下,延迟加载模块提供的依赖关系不会被添加到根注入器。相反,这些依赖项将被添加到延迟加载模块的根组件中(我学到了很多 - 如果你有多个'根组件'你的延迟加载模块,每个'根组件& #39;将获得自己的依赖实例)。

因此,它仍然是相同的基本层次结构 - 它只是急切加载的模块将其依赖项添加到根注入器,而延迟加载的模块将它们添加到其模块的根组件。此外,如果延迟加载的模块导入也提供依赖项的NgModule(例如,您的SharedModule),那么这些依赖项也将添加到模块的根组件中。 (请注意,如果SharedModule也是预先加载的,它的依赖项也将被添加到根注入器 - 导致这些依赖项的多个实例可用)。

最后一点是你看到你所看到的行为的原因。当您的惰性模块导入SharedModule时,SharedModules提供的依赖项将添加到惰性模块的根组件中 - 导致这些依赖项的重复实例。