You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:17:34