Angular 2/4+ 共享模块:使用 forRoot() 或不使用 forRoot()

Angular 2/4+ Shared Module: To forRoot() or not to forRoot()

自从挖掘 Angular 依赖注入 (DI) 的前几个基本级别,并找到 gem 即 forRoot() 以来,我一直想知道最佳实践到底是什么实际使用它。

我在寻找一种允许延迟加载模块访问根上下文中的服务的方法时偶然发现了该方法,允许在两个模块之间共享数据流,其中一个或两个可能是懒加载。从那时起我就在想,你能否对共享模块中的所有内容都使用 forRoot() 并在整个应用程序中节省大量导入语句?收获是什么?是否有某些东西可以很容易地用于 root,而其他东西则不是?还是为 root 开发的主要目的是在桥接延迟加载模块时桥接上述 DI 上下文问题?

forRoot()的目的是在申请中有singleton services

forRoot() 的意思是只有一个 service 的实例,由 ModuleWithProviders 导出。在没有 forRoot() 的情况下,如果您在模块的 providers 中添加了一个 service 并在许多地方使用了该模块,那么您可以在你的申请。使用 forRoot() ,它将创建一个 service 的新实例,如果在任何地方都找不到最后一个实例。

forRoot 静态方法只是配置 模块提供者的约定。

例如:RouterModule.forRoot: 您将路由传递给 forRoot 方法,以便使用路由配置应用范围的路由器服务。

使用您在应用程序中随处使用的组件、指令和管道创建一个 SharedModule。

SharedModule 不应该有 reasons explained here 的提供者。它的任何导入或重新导出的模块也不应该有提供者。如果您偏离了这条准则,请知道您在做什么以及为什么。