创建核心模块时,我们将创建forRoot()
,forChild
静态方法,以禁止对其提供的提供程序进行多次实例化。但是,我对forChild()
感到困惑。如果核心模块为延迟加载的模块的注入器提供了其他提供程序,那么我们当然也必须声明一个forChild()
静态方法。
但是,如果核心模块没有延迟加载模块的注入器提供程序,我们是否可以让延迟加载模块仅使用imports: [CoreModule]
而不使用imports: [CoreModule.forChild()]
来导入核心模块?因为核心模块本身没有声明提供程序,所以我认为延迟加载的模块可以正常导入核心模块。
@NgModule({
imports: [
BrowserModule,
CoreModule.forRoot(), // imports Core Module for root injector
AppRoutingModule
],
providers: [],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
}) export class AppModule { }
@NgModule({
imports: [ CommonModule ],
declarations: [ ButtonComponent ],
exports: [ ButtonComponent ],
providers: [] // It doesn't have a provider in itself.
}) export class CoreModule {
// It is using forRoot() to register a provider.
// But, it doesn't declare forChild().
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserService, useClass: UserServiceImpl }
]
};
}
}
@NgModule({
imports: [
CommonModule,
CoreModule // imports core module not using `forChild`
],
declarations: [ ],
providers: [ ]
}) export class LazyLoadedModule {}
所以,我的问题是,当我们使用forChild()
方法时,不需要声明forRoot()
吗?
有关更详细的情况,我建议与RouterModule
类似的示例。此模块具有forRoot()
和forChild
。考虑一个像RouterModule
这样的模块,但是它没有用于延迟加载模块的其他提供程序。