Angular Service 单例问题探究

墙竹

引言

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 {
   }

这个<

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值