引言
Angular Service是一种实现代码抽象的方式。它可以帮助我们将业务逻辑从页面的呈现逻辑中分离出来,以保持Component功能的纯净,以及某些常见功能的重用。一些开发者认为Component应该只处理页面呈现以及用户交互方面的逻辑,其他的都应该抽象到service中,即所谓的Lean Angular Component思想。
我们在使用Angular Service时会有这种场景:有一个变量的状态是全局有效的,在不同的Component中都可能修改这个状态值,并且每个Component中都可以拿到这个Service中该状态变量的最新值。为了实现这个场景,一个最关键的点就是,Service必须是单例的。因为一旦有多个实例,那么每个Component看到的状态变量的值就不一致了。这篇文章就来试图探讨一下,什么情况下Angular Service会产生多个实例,以及如何解决这个问题。
Angular的官方文档关于单例Service的话题有不错的讨论。除了这篇文章,本文还参考了其他讨论类似话题的文章,再结合了自己的理解。欢迎批评和讨论。
什么时候会有多个实例?
总的来说在两种情况下,Angular会生成多实例的Service:
-
声明Service的共享Module被多个其他Module导入
-
声明Service的共享Module被其他lazy-load的Module导入
这两种情况看起来比较类似,但其实背后的原理有些不同,我们分别来看。
第一种情况是很常见的做法:我们定义了一个Service,比如是关于获取用户数据的,自然就会把它归到跟用户逻辑相关的Feature Module中,比如Customer Module:
@NgModule({
providers: [CustomerService],
declarations: [CustomerComponent],
entryComponents: [CustomerComponent]
})
export class CustomerModule {
}
这个<