我有一个关于Angular Dependancy Injection的快速问题。我已经读过,如果您希望服务在您的应用程序中只有一个实例,它应该作为提供程序包含在AppModule中,而不是任何使用它的组件。这仍然适用于AppModule导入的其他模块。例如,我想在我的SharedModule中将AuthService作为提供者。如果我然后将此模块导入AppModule,我的应用程序中的所有组件是否会共享相同的服务实例?
答案 0 :(得分:1)
简答:是的
,但..
不要在共享模块中指定应用程序范围的单例提供程序。导入该共享模块的延迟加载模块会创建自己的服务副本。
来源:https://angular.io/guide/ngmodule#why-userservice-isnt-shared
答案 1 :(得分:0)
不,您无法使用NgModule导入/导出来强制执行单例模式。正如echonax的回答所指出的,延迟加载模块会再次引导所有服务。
话虽如此,您可以通过构造函数阻止模块上的重复导入。这将强制开发人员管理模块加载顺序,还可以防止惰性模块直接导入它。如果模块是由辅助模块导入的,那么它似乎可以解决这个问题。
您可以在NgModule类构造函数
中阻止这样@NgModule({
providers: [
MySingletonService
]
})
export class ExampleModule {
public constructor(@Optional() @SkipSelf() parentModule: ExampleModule) {
if (parentModule) {
throw new Error('ExampleModule is already loaded');
}
}
}
最好创建只包含一项服务的模块,而不是将它们用于其他任何项目。这使得管理各种依赖关系变得更加容易。