Blazor WASM单例服务控制器间值共享失效问题排查
问题解答
问题1:使用Singleton Service是否是解决该需求的正确方案?
完全正确。你的需求是一次性加载数据,应用生命周期内数据不变、所有用户共享,而Singleton服务的特性完全匹配这个场景:
- 整个应用生命周期仅创建一个实例
- 所有依赖该服务的组件、控制器共享同一个实例
- 数据在应用启动后加载,不会随请求或用户变化
这是当前需求下的最优实现方案。
问题2:为何每次调用控制器/服务时计数器值都会重置?
问题出在控制器的构造函数中——你没有使用依赖注入提供的单例IServicePOC实例,而是手动new了一个全新的ServicePOC对象:
public ServicePOCController(ApplicationDbContext context, ILogger<ServicePOCController> logger, UserManager<ApplicationUser> userManager, IServicePOC servicePOC) { this.logger = logger; this.userManager = userManager; this._context = context; // 错误:手动创建新实例,放弃了注入的单例 this.servicePOC = new ServicePOC(); }
ASP.NET Core中控制器默认是Scoped生命周期,即每次HTTP请求都会创建一个新的控制器实例。你每次在构造函数里手动实例化ServicePOC,就意味着每个请求都会得到一个全新的服务实例,计数器自然每次从0开始递增,永远返回“第1次调用”。
修正方法
直接使用依赖注入传入的单例实例即可:
public ServicePOCController(ApplicationDbContext context, ILogger<ServicePOCController> logger, UserManager<ApplicationUser> userManager, IServicePOC servicePOC) { this.logger = logger; this.userManager = userManager; this._context = context; // 正确:使用注入的单例实例 this.servicePOC = servicePOC; }
另外,你的ServicePOC类里存在无用的字段和空构造函数,可以简化为:
public class ServicePOC : IServicePOC { public int CallCount { get; set; } = 0; public string CallService() { CallCount++; return $"Hello from your service! (Call #{CallCount})"; } }
修改后,所有请求都会共享同一个单例ServicePOC实例,计数器会正确递增。
内容的提问来源于stack exchange,提问作者Prv
相关产品推荐
相关产品推荐

