Angular 角依赖注入
我有一个关于角度依赖注入的快速问题。我已经读到,如果你希望一个服务在你的应用程序中只有一个实例,那么它应该作为一个提供者包含在AppModule中,而不是任何使用它的组件中。这是否仍然适用于AppModule导入的其他模块。例如,我希望在SharedModule中使用AuthService作为提供程序。如果我随后将此模块导入AppModule,我的应用程序中的所有组件是否共享同一服务实例?简短回答:是 但是 不要在共享模块中指定应用程序范围的单例提供程序。导入该共享模块的延迟加载模块生成其自己的服务副本Angular 角依赖注入,angular,typescript,Angular,Typescript,我有一个关于角度依赖注入的快速问题。我已经读到,如果你希望一个服务在你的应用程序中只有一个实例,那么它应该作为一个提供者包含在AppModule中,而不是任何使用它的组件中。这是否仍然适用于AppModule导入的其他模块。例如,我希望在SharedModule中使用AuthService作为提供程序。如果我随后将此模块导入AppModule,我的应用程序中的所有组件是否共享同一服务实例?简短回答:是 但是 不要在共享模块中指定应用程序范围的单例提供程序。导入该共享模块的延迟加载模块生成其自己的
来源:不,您不能使用NgModule导入/导出来强制实施单例模式。正如echonax的回答所指出的,惰性加载模块再次引导所有服务 也就是说,您可以通过构造函数阻止模块上的重复导入。这将迫使开发人员管理模块加载顺序,并防止惰性模块直接导入。如果该模块是由辅助模块导入的,则似乎可以解决此问题 您可以在NgModule类构造函数中这样阻止
@NgModule({
providers: [
MySingletonService
]
})
export class ExampleModule {
public constructor(@Optional() @SkipSelf() parentModule: ExampleModule) {
if (parentModule) {
throw new Error('ExampleModule is already loaded');
}
}
}
最好创建只包含一个服务的模块,不要将其用于其他任何用途。这使得管理各种依赖项变得更加容易。请在标题中描述您的问题。我真的不知道如何操作。是的,除了延迟加载的向根Injector添加提供程序之外的所有模块都可以看到,因为SharedModule可能会被导入多次,因此AuthModule会有多个实例。在CoreModule中,只导入一次。对吗?@user455289是的,但仅当这些模块是延迟加载的。如果没有,它似乎会起作用,但不推荐使用。如果在角文档中不推荐什么东西,你应该考虑一下,因为它们可能会在将来的版本中改变它。