MassTransit自定义FluentValidation中间件无法获取IServiceProvider问题求助
解决方法
方案1:直接使用内置属性(最简单,无需修改现有架构)
MassTransit 的 ConsumeContext 本身就公开了 ServiceProvider 原生属性,不需要通过 GetPayload<IServiceProvider>() 方式获取,你只需要修改 FluentValidationFilter 中获取服务提供者的代码即可:
// 替换掉原有的 context.GetPayload<IServiceProvider>() 行 var serviceProvider = context.ServiceProvider;
该方案完全兼容你现有的 IFilter<ConsumeContext<TMessage>> 实现和 FluentValidationFilterConfigurationObserver 代码,不需要做其他调整。
方案2:上下文类型转换(适用于需要使用 ConsumerConsumeContext 其他能力的场景)
如果你后续确实需要用到 ConsumerConsumeContext 特有的属性/方法,不需要修改 Filter 的泛型约束,也不需要更换配置观察者,直接在 Send 方法中做上下文类型转换即可:
public async Task Send( ConsumeContext<TMessage> context, IPipe<ConsumeContext<TMessage>> next) { if (context is ConsumerConsumeContext<TMessage> consumerContext) { // 此处即可使用 consumerContext 获取对应能力 var serviceProvider = consumerContext.ServiceProvider; } // 其余原有逻辑保持不变 }
额外优化建议
你当前的 ConsumerMessageConfigured 方法中重复添加了两次 Filter,会导致同一条消息被验证两次,删除其中任意一行即可,保留 _pipeConfigurator.UseFilter(new FluentValidationFilter<TMessage>()); 即可满足注册需求。
如果你的验证器存在其他依赖注入项,建议将 Filter 也注册到DI容器中,使用开放泛型注册即可:
services.AddTransient(typeof(FluentValidationFilter<>));
注册后在配置观察者中从容器获取 Filter 实例,即可支持 Filter 自身的依赖注入需求。
内容的提问来源于stack exchange,提问作者benjamin
相关产品推荐
相关产品推荐

