如何使用Autofac配置注入控制器的MassTransit.IMediator并解决响应报错问题?
问题根因
- 初始
AddMediator配置不生效:该方法是MassTransit针对微软官方依赖注入框架提供的扩展方法,直接在Autofac原生ContainerBuilder上调用无法识别,自然没有完成IMediator及配套请求响应服务的注册。 - 手动注册后抛出响应未消费错误的核心原因:
- 直接调用
MassTransit.Bus.Factory.CreateMediator创建实例时,没有关联Autofac容器作为服务提供者,请求响应所需的内部寻址、生命周期管理服务没有正确初始化 - 控制器代码中冗余创建了
RequestClient但未使用,和后续mediator.GetResponse的内部响应监听逻辑冲突,导致响应消息无法匹配到等待者 - 手动注册Mediator时未显式绑定到
MassTransit.Mediator.IMediator接口,依赖注入时可能出现类型匹配问题
- 直接调用
修复方案
第一步:调整Autofac Mediator配置
首先确保已安装NuGet包MassTransit.Autofac,再将WebApiConfig的注册逻辑替换为以下代码:
var builder = new ContainerBuilder(); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // 接入MassTransit Autofac集成扩展 builder.AddMassTransit(x => { x.AddMediator(cfg => { cfg.AddConsumer<GoCreateJobConsumer>(); }); x.UseAutofacContainerBuilder(builder); }); var container = builder.Build(); config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
该配置会自动完成IMediator、所有消费者、泛型IRequestClient<>的生命周期注册,完全兼容Autofac的依赖注入规则。
第二步:修正控制器代码
删除冗余的RequestClient创建逻辑,保留正确的请求响应调用即可:
[HttpPost] public async Task CreateFooJob(FooJobRequest myRequest) { // 直接调用IMediator.GetResponse即可,建议传入请求取消令牌 var response = await mediator.GetResponse<GoCreateJobResponse>( new GoCreateJobRequest(myRequest), cancellationToken: HttpContext.RequestAborted); return; }
你也可以选择直接在控制器构造函数注入IRequestClient<GoCreateJobRequest>,用客户端发送请求,逻辑更清晰:
public class FooController{ private readonly IRequestClient<GoCreateJobRequest> _requestClient; public FooController(IRequestClient<GoCreateJobRequest> requestClient) { _requestClient = requestClient; } [HttpPost] public async Task CreateFooJob(FooJobRequest myRequest){ var response = await _requestClient.GetResponse<GoCreateJobResponse>( new GoCreateJobRequest(myRequest), HttpContext.RequestAborted); return; } }
额外注意事项
- 建议将
GoCreateJobConsumer从FooController内部移到独立的类文件中,避免嵌套类的生命周期绑定异常 - 所有请求、响应类需保证可被序列化,不要包含特殊的私有构造函数或者不可序列化的成员
内容的提问来源于stack exchange,提问作者Warbler
相关产品推荐
相关产品推荐

