Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角依赖注入_Angular_Typescript - Fatal编程技术网

Angular 角依赖注入

Angular 角依赖注入,angular,typescript,Angular,Typescript,我有一个关于角度依赖注入的快速问题。我已经读到,如果你希望一个服务在你的应用程序中只有一个实例,那么它应该作为一个提供者包含在AppModule中,而不是任何使用它的组件中。这是否仍然适用于AppModule导入的其他模块。例如,我希望在SharedModule中使用AuthService作为提供程序。如果我随后将此模块导入AppModule,我的应用程序中的所有组件是否共享同一服务实例?简短回答:是 但是 不要在共享模块中指定应用程序范围的单例提供程序。导入该共享模块的延迟加载模块生成其自己的

我有一个关于角度依赖注入的快速问题。我已经读到,如果你希望一个服务在你的应用程序中只有一个实例,那么它应该作为一个提供者包含在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是的,但仅当这些模块是延迟加载的。如果没有,它似乎会起作用,但不推荐使用。如果在角文档中不推荐什么东西,你应该考虑一下,因为它们可能会在将来的版本中改变它。