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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:01:06