Blazor Server中Scoped服务为何每页重复实例化?求排查
问题根源与解决方案:Blazor Server Scoped服务页面导航时重建
核心原因
你遇到的问题并非Scoped服务注册错误,而是使用了触发全页面刷新的导航方式,导致Blazor Server的Circuit(浏览器标签会话)被重建,进而Scoped服务重新实例化。
Blazor Server服务生命周期回顾
AddScoped:服务实例与单个Circuit绑定,同一个浏览器标签内的所有页面/组件共享同一实例,正常客户端导航不会重建Circuit,服务实例保持不变。AddSingleton:服务实例全局唯一,所有Circuit(多标签/多用户)共享,因此你观察到多标签仅一个实例的现象符合预期。
问题排查与修复
检查导航方式
如果你使用原生HTML<a>标签导航(如下),点击时会触发浏览器全页面刷新,直接断开当前Circuit并创建新会话:<a href="/TestPage">跳转到测试页</a>替换为Blazor客户端导航
使用Blazor提供的客户端路由方式,避免全页面刷新:- 方式一:使用
NavLink组件(支持路由高亮)<NavLink href="/TestPage" class="nav-link">跳转到测试页</NavLink> - 方式二:通过
NavigationManager编程式导航@inject NavigationManager NavManager <button @onclick="NavigateToTest">跳转到测试页</button> @code { private void NavigateToTest() { NavManager.NavigateTo("/TestPage"); } }
- 方式一:使用
验证修复效果
修改导航方式后,再次测试页面切换:TestService的构造函数只会在首次打开标签时调用一次,后续页面导航不会触发重新实例化。
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

