与AngularModule不同的是,AngularComponents和Directives需要被多次实例化,HTML模板中出现的每个标记都会被实例化一次。此外,这些项也限定在导入它们的NgModule范围内,以防止两个组件使用相同的选择器时发生命名冲突。由于依赖注入(DI)行为的这种差异,区分包含组件和指令的NgModule和包含组件、指令和提供程序的ModuleWithProviders是很有帮助的,这就是forRoot()方法进行区分的地方.下面是SAPSpartacus中forRoot方法的一个例子:siteContext,provideConfigValidator(baseSiteConfigValidator),{提供:CONFIG_INITIALIZER,useFactory:initSiteContextConfig,deps:[SiteContextConfigInitializer,SiteContextConfig],multi:true,},...contextInitializerProviders,],};}}然而,依赖注入并不总是那么简单。有时,应用程序的所有ngmodules在引导过程中都不可用。延迟加载就是这样的一个例子。当一个NgModule在路由期间延迟加载时,在延迟加载的NgModule中注册的提供者及其子模块在引导期间不可用,此时Angular无法注册它们。因此,它们只会在路由加载时作为提供者添加,并且它们的作用域将从延迟加载的NgModule及其子模块开始注入。如果有多个延迟加载的NgModule试图注册同一个提供者,则NgModule树中的每个节点最终都会有一个不同的实例。通过在根目录中导入提供程序,它有助于确保所有延迟加载的ngmodules都获得该提供程序的相同实例,这就是forRoot()被命名的原因。总结什么时候使用Module的forRoot方法?简而言之,当一个库的依赖需要某个模块时,调用该模块的forRoot方法,达到全局导入提供者的目的。在其他ngmodules中,必要时使用import的非根形式来导入组件和指令。当功能NgModule导出的组件和指令需要共享相同的自定义提供程序实例时,请考虑使用forRoot()方法在根NgModule中注册这些提供程序。这有助于确保所有子ngmodules都可以访问同一提供者实例,而无需消费者显式处理提供者注册。
