Angular 2惰性模块和共享模块单例

Angular 2惰性模块和共享模块单例,angular,Angular,我正在使用本文学习angular2的延迟加载和共享依赖项。我知道lazy模块有一个独立的依赖关系树,它与eager模块不共享同一个服务实例 当我从lazy模块的imports部分删除sharedmoduleimport时,行为发生了变化,我得到了eager模块和lazy模块之间的单例服务 根据文档,为了重用相同的共享服务,还有更多的工作要做,如本文所述。但我可以通过从共享模块定义中删除导入来实现。有人能解释这种行为吗 这是你的电话号码 延迟加载不会创建单独的依赖关系树-至少,不会以您描述的方式创

我正在使用本文学习angular2的延迟加载和共享依赖项。我知道lazy模块有一个独立的依赖关系树,它与eager模块不共享同一个服务实例

当我从lazy模块的imports部分删除sharedmoduleimport时,行为发生了变化,我得到了eager模块和lazy模块之间的单例服务

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

这是你的电话号码


延迟加载不会创建单独的依赖关系树-至少,不会以您描述的方式创建

您可能已经知道,Angular的依赖项注入系统实际上是一个注入器树—视图层次结构中的每个组件对应一个注入器。当您请求依赖项时,Angular将遍历此喷油器树,从请求依赖项的组件开始,直到找到第一个能够提供该依赖项的喷油器。 如果需要,这将为您提供大量功能,因为在组件树的任何级别,您都可以为组件上的依赖项指定一个提供程序,并让该组件获得其自己的依赖项实例。此外,该组件的任何子组件也将共享该依赖项的相同实例

这是分层依赖注入如何针对组件工作的基本概要。然而,当谈到模块时,情况就有点不同了。默认情况下,NgModule提供的任何依赖项都会添加到根注入器,这意味着该依赖项的单个实例将由整个应用程序共享。例外情况是,如果NgModule是延迟加载的。在这种情况下,延迟加载模块提供的依赖项将不会添加到根注入器。相反,这些依赖项将被添加到延迟加载模块的根组件中(我通过艰难的方式了解到了这一点——如果您有多个延迟加载模块的“根组件”,那么每个“根组件”将获得其自己的依赖项实例)

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


最后一点就是为什么你会看到你所看到的行为。当您的懒惰模块导入SharedModule时,SharedModule提供的依赖项会添加到懒惰模块的根组件中,从而导致这些依赖项的重复实例

我可以向你解释。列出你所有的问题。我的问题是,尽管我没有遵循另一篇文章中的步骤,但为什么它能起作用。i、 e我没有将共享模块作为.forRoot()导入。答案很好。顺便说一句,从实用的角度来看,值得注意的是,如果服务总是由任何急切加载的
ngModule
加载,那么就没有理由将其导入到延迟加载的模块中。另一方面,如果您将状态排除在服务之外,那么这个问题根本不会影响您。@AluanHaddad关于将状态排除在服务之外的观点非常好。我的意思是,有时这是不可避免的——您将服务用作两个不同组件之间的状态共享机制——但这更多的是例外而不是规则
@NgModule({
  imports: [
    //SharedModule   //This is removed
    routing
  ],
  declarations: [LazyComponent]
})