保留接口绑定,解决托管服务依赖注入实例不一致问题
解决方案
问题根源在于你当前的注册方式创建了两个独立的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
相关产品推荐
相关产品推荐

