如何在ServiceProvider作用域内替换服务?解决ICurrentUserInfo后台失效问题
在ServiceProvider作用域内替换特定服务的方法
我正在寻找一种在ServiceProvider作用域内替换特定服务的方法。
实际场景是我们的遗留应用中,当前用户被注册为ICurrentUserInfo服务,通过当前HttpContext获取,示例代码如下:
services.AddScoped<ICurrentUserInfo>(sp => { // 简化版本,实际包含HttpContext.Session缓存逻辑,核心是通过HttpContext获取当前用户 var context = sp.GetRequiredService<IHttpContextAccessor>(); return new CurrentUserInfo(context.HttpContext.User.Identity.Name); });
问题在于,启动后运行后台任务时,所有依赖ICurrentUserInfo的服务都会因不存在HttpContext.Current而失效。我原本希望能实现类似以下的逻辑:
using (var scope = serviceProvider.CreateScope()) { scope.ServiceProvider.Register<ICurrentUserInfo>(sp => /* 获取“服务”账户 */); // 在此作用域内解析的服务可正常工作,其他服务仍使用原ICurrentUserInfo实现 }
但我了解到,ServiceProvider从服务集合构建完成后就无法再修改。
是否有其他解决该问题的方法?
**(更新)**已找到解决方案,因此将此问题标记为重复。
方案概述:注册一个代理类作为作用域服务,在新作用域中先手动解析代理并替换实现,再执行实际操作。此方式对调用者透明,且仅作用于当前新作用域。
内容的提问来源于stack exchange,提问作者Lou
相关产品推荐
相关产品推荐

