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

Autofac 8.0.0多租户依赖注入层级作用域失效问题求助

Autofac 8.0.0多租户层级作用域恢复方案

问题背景

  • 升级至Autofac/Multitenant 8.0.0后,IServiceScopeFactory改为单例,子作用域变为扁平结构而非层级结构
  • 原控制器可从租户生命周期作用域(父作用域)解析依赖,现在父作用域仅为root,导致依赖解析失败
  • 希望通过Autofac原生的层级作用域创建代码恢复原有逻辑,但不确定在ASP.NET Core中的放置位置

解决方案:基于租户作用域接管层级作用域创建

要恢复层级作用域,核心是让后续子作用域基于租户生命周期作用域而非root作用域生成,具体实现步骤如下:

1. 自定义IServiceScopeFactory替换默认实现

创建自定义作用域工厂,优先从当前请求的租户作用域创建层级子作用域:

public class TenantHierarchicalServiceScopeFactory : IServiceScopeFactory
{
    private readonly ILifetimeScope _rootLifetimeScope;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public TenantHierarchicalServiceScopeFactory(ILifetimeScope rootLifetimeScope, IHttpContextAccessor httpContextAccessor)
    {
        _rootLifetimeScope = rootLifetimeScope;
        _httpContextAccessor = httpContextAccessor;
    }

    public IServiceScope CreateScope()
    {
        // 从HttpContext获取当前租户的生命周期作用域
        var tenantScope = _httpContextAccessor.HttpContext?.Items[AutofacMultitenantMiddleware.TenantLifetimeScopeKey] as ILifetimeScope;
        
        // 存在租户作用域则基于它创建层级子作用域,否则回退到root作用域
        var scope = tenantScope?.BeginLifetimeScope() ?? _rootLifetimeScope.BeginLifetimeScope();
        return new AutofacServiceScope(scope);
    }
}

2. 在Autofac容器配置中注册自定义工厂

在容器配置方法中,替换默认的IServiceScopeFactory实现:

public void ConfigureContainer(ContainerBuilder builder)
{
    // 保留原有多租户注册逻辑
    builder.RegisterMultitenantContainer(_tenantIdentificationStrategy);
    
    // 注册自定义作用域工厂为单例
    builder.RegisterType<TenantHierarchicalServiceScopeFactory>()
           .As<IServiceScopeFactory>()
           .SingleInstance();
    
    // 注册业务组件...
}

3. 确保IHttpContextAccessor可用

在服务注册阶段添加HttpContext访问器:

builder.Services.AddHttpContextAccessor();

代码放置位置说明

  • 自定义TenantHierarchicalServiceScopeFactory:放在项目的DI扩展类或Autofac配置目录下
  • 容器注册逻辑:在ASP.NET Core的Startup.cs(.NET 6及以前)或Program.cs的容器配置段中
  • AddHttpContextAccessor:在Program.cs的服务注册部分

效果验证

配置完成后,控制器中创建的子作用域会自动继承当前租户的生命周期作用域:

  • 子作用域从租户作用域而非root解析依赖
  • 租户作用域销毁时,其子作用域会同步无法解析依赖,恢复原有层级行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:15:45