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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:04