从MassTransit v5升级到v8后,多租户应用的Autofac扩展方法失效
.NET 6升级中MassTransit v8 + Autofac多租户消费者依赖注入问题
背景
正在将一个.NETStandard 2.1应用升级至.NET 6,同步升级相关依赖库:MassTransit从v5升级到v8、Autofac从4.9.4升级到6.4.0。这是一个单实例服务多租户的应用,每个租户拥有独立数据库。
核心问题
升级整体顺利,但原本用于在消费者中设置租户信息的AutofacReceivedEndpointExtensions已不可用,原有的租户注入逻辑无法延续。原核心代码如下:
config.ReceiveEndpoint(host, azureBusConfig.QueueName, endpoint => { ConfigureConsumer<MyConsumer>(endpoint, componentContext); }); private static void ConfigureConsumer<TConsumer>(IServiceBusReceiveEndpointConfigurator endpoint, IComponentContext componentContext, Action<IConsumerConfigurator<TConsumer>> configure = null) where TConsumer : class, IConsumer { endpoint.Consumer(componentContext, configure, configureScope: (container, context) => { var tenantName = context.Headers.Get<string>("tenant"); var userId = context.Headers.Get<int>("userId"); container.RegisterInstance(new NamedTenantInfoProvider(tenantName, userId)).As<ITenantInfoProvider>(); }); }
上述代码中的endpoint.Consumer方法已不存在。
依赖说明
ITenantInfoProvider接口会被注入到多个构造函数中(例如用于为租户切换数据库的DbContext),定义如下:
public interface ITenantInfoProvider { string GetTenantName(); int? GetUserId(); }
该接口有两个实现:
NamedTenantInfoProvider:从消息头中提取租户信息RequestTenantInfoProvider:从HttpRequest中提取租户信息,注册方式如下:
builder.RegisterType<RequestTenantInfoProvider>() .As<ITenantInfoProvider>() .InstancePerLifetimeScope();
预期逻辑与尝试结果
预期逻辑:默认场景注入RequestTenantInfoProvider,消息消费场景注入NamedTenantInfoProvider实例。
曾尝试注册NamedTenantInfoProvider并注入IEnumerable<ITenantInfoProvider>,在消费配置中设置租户信息,但该实例会在DbContext等依赖需要它之后才初始化,导致租户信息失效。目前只能通过硬编码租户名让应用运行,不符合需求。
本人首次接触MassTransit,可能对其DI作用域理解不足,希望有类似重构经验的开发者提供替代方案。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

