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

保留接口绑定,解决托管服务依赖注入实例不一致问题

解决方案

问题根源在于你当前的注册方式创建了两个独立的AvailabilityWorker单例实例:

  • AddSingleton<IAvailabilityWorker, AvailabilityWorker>() 会创建一个实例,用于注入IAvailabilityWorker接口
  • AddHostedService<AvailabilityWorker>() 会单独创建另一个实例,作为后台托管服务运行

因此你调用set_last_time时操作的是第一个实例,而后台运行的是第二个实例,导致设置不生效。

以下两种方法可以解决问题,确保全局只有一个实例:

方法一:复用接口注册的实例作为托管服务

先注册接口与实现的单例映射,再通过服务提供者获取该实例作为托管服务:

// 注册接口到实现的单例
builder.Services.AddSingleton<IAvailabilityWorker, AvailabilityWorker>();
// 从容器中获取已注册的实例,作为托管服务添加
builder.Services.AddHostedService(sp => 
    sp.GetRequiredService<IAvailabilityWorker>() as AvailabilityWorker);

方法二:先注册实现类单例,再映射接口并添加托管服务

先单独注册实现类为单例,再将接口映射到该实例,最后添加托管服务时复用同一个实例:

// 注册实现类为单例
builder.Services.AddSingleton<AvailabilityWorker>();
// 将接口映射到已注册的实现类单例
builder.Services.AddSingleton<IAvailabilityWorker>(sp => 
    sp.GetRequiredService<AvailabilityWorker>());
// 添加托管服务,复用已注册的单例
builder.Services.AddHostedService<AvailabilityWorker>();

两种方式都能保证注入IAvailabilityWorker、直接注入AvailabilityWorker以及后台运行的托管服务,都是同一个实例,调用set_last_time的修改会直接作用在后台运行的实例上,同时保留了接口注册以支持测试。

内容的提问来源于stack exchange,提问作者Foxxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:58:19