我正在尝试了解 Angular 4 中的核心模块和单例服务。官方文档(https://angular.io/guide/ngmodule)说明了以下内容:
UserService 是一个应用程序范围的单例。您不希望每个模块都有自己单独的实例。然而,如果 SharedModule 提供了 UserService,那么就存在真正的危险。
CoreModule 提供 UserService。Angular 将该提供程序注册到应用程序根注入器,使 UserService 的单例实例可供任何需要它的组件使用,无论该组件是急切加载还是延迟加载。
我们建议收集此类一次性类并将其详细信息隐藏在 CoreModule 中。简化的根 AppModule 以作为整个应用程序的编排器的身份导入 CoreModule。
import { CommonModule } from '@angular/common';
import { TitleComponent } from './title.component';
import { UserService } from './user.service';
import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';
@NgModule({
imports: [ CommonModule ],
declarations: [ TitleComponent ],
exports: [ TitleComponent ],
providers: [ UserService ]
})
export class CoreModule {
constructor (@Optional() @SkipSelf() parentModule: CoreModule) { ... }
}
所以我使用提供单例服务的核心模块和构造函数
constructor (@Optional() @SkipSelf() parentModule: CoreModule) { ... }
防止多次导入核心模块。
1) 但是,如果我在另一个模块中提供 UserService(例如在延迟加载模块中)怎么办?这个延迟加载的模块有一个新的服务实例?
关于 forRoot 方法:
@NgModule({
imports: [ CommonModule ],
providers: [ UserService ]
})
export class CoreModule {
}
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserServiceConfig, useValue: config }
]
};
}
}
2) 如果我在 AppModule 中使用 CoreModule.forRoot() 导入 CoreModule,那么 UserService 会发生什么?是否也提供?
谢谢