角度依赖性注射

时间:2017-07-04 13:51:51

标签: angular typescript

我有一个关于Angular Dependancy Injection的快速问题。我已经读过,如果您希望服务在您的应用程序中只有一个实例,它应该作为提供程序包含在AppModule中,而不是任何使用它的组件。这仍然适用于AppModule导入的其他模块。例如,我想在我的SharedModule中将AuthService作为提供者。如果我然后将此模块导入AppModule,我的应用程序中的所有组件是否会共享相同的服务实例?

2 个答案:

答案 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');
        }
    }
}

最好创建只包含一项服务的模块,而不是将它们用于其他任何项目。这使得管理各种依赖关系变得更加容易。