Blazor Server中服务的Scoped生命周期具体指什么?
Blazor Server中Scoped与Singleton服务的生命周期差异
本文针对Blazor Server场景。
官方文档对Blazor Server中Scoped服务的会话作用域定义:
当客户端在组件间导航时,Scoped服务不会被重新创建,此时客户端与服务器通过用户circuit的SignalR连接通信,而非HTTP请求。
技术博客中提到:
系统会为每个所谓的“circuit”创建一个作用域。当新浏览器标签页通过底层SignalR传输连接到Blazor Server时,circuit被创建;当浏览器标签页关闭(或连接断开且未在指定时间内重连)时,circuit终止。
但有观点称:
如果是Blazor Server场景,Scoped的行为类似Singleton。官方文档涵盖了服务生命周期的工作原理。
关于Singleton的定义:
DI创建服务的单个实例。所有需要Singleton服务的组件都会接收该服务的同一实例。
这里的“所有组件”存在歧义:既可以指单个circuit/会话中的所有组件,也可以指跨所有circuit/会话的所有组件。若按前者理解,Scoped在多数场景下与Singleton表现一致;但如果Singleton是跨所有circuit/会话的单个实例,两者差异则极大。
那么Blazor Server中Scoped与Singleton服务的具体表现究竟是怎样的?
总结
相关讨论曾引发情绪对立(我不愿看到这种情况),以下是对讨论内容的总结:
- Singleton:每次调用都会返回同一实例,适用于所有用户共享的信息场景,比如获取特定地区的销售税率。
- Scoped:会为每个SignalR circuit(Blazor Server中常称为作用域)返回不同实例;在单个circuit的生命周期内,会持续返回同一实例,适用于用户专属的场景,比如购物车。
容易混淆的点:
- 在单个circuit的生命周期内,Singleton和Scoped服务都会返回同一实例,表现一致。
- 当服务器存在多个circuit时,Singleton会向所有circuit返回同一实例,而Scoped会为每个circuit返回独立实例,两者差异显著。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

