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
相关产品推荐
相关产品推荐

