已调用AddMassTransit注册后,如何通过微软DI添加更多MassTransit消费者?
已注入DI容器后MassTransit追加消费者的实现方案
方案1:使用ConfigureMassTransit扩展直接追加(推荐)
MassTransit原生提供了ConfigureMassTransit扩展方法,只要还未构建IServiceProvider,哪怕已经执行过AddMassTransit,也可以用该方法追加消费者配置,不需要修改原有模块的代码:
示例代码
// Module 1 原有逻辑,先执行AddMassTransit注册基础配置 services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.AddConsumer<ConsumerOfModule1>(); // 传输层配置,比如RabbitMQ x.UsingRabbitMq((context, cfg) => { cfg.ConfigureEndpoints(context); }); }); // Module 2 后续追加消费者的逻辑,在构建ServiceProvider之前调用即可 services.ConfigureMassTransit(x => { // 此处添加消费者的效果和写在AddMassTransit委托中完全一致 x.AddConsumer<ConsumerOfModule2>(); // 也可以单独配置该消费者的重试、限流等规则 x.AddConsumer<ConsumerOfModule2>(c => { c.UseMessageRetry(r => r.Interval(3, 1000)); }); });
方案2:预收集配置委托统一应用
如果需要明确管控所有模块的MassTransit配置顺序,可以提前收集各模块的配置动作,统一传入AddMassTransit执行:
示例代码
// 公共类库中定义全局配置收集器 public static class MassTransitConfigCollector { private static readonly List<Action<IBusRegistrationConfigurator>> _configActions = new(); public static void AddConfig(Action<IBusRegistrationConfigurator> action) { _configActions.Add(action); } public static void ApplyAll(IBusRegistrationConfigurator configurator) { foreach (var action in _configActions) { action(configurator); } } } // Module 2 初始化阶段(早于AddMassTransit执行)注册自身配置 MassTransitConfigCollector.AddConfig(x => { x.AddConsumer<ConsumerOfModule2>(); }); // Module 1 执行AddMassTransit时统一应用所有配置 services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.AddConsumer<ConsumerOfModule1>(); // 执行所有模块预注册的配置 MassTransitConfigCollector.ApplyAll(x); x.UsingRabbitMq((context, cfg) => { cfg.ConfigureEndpoints(context); }); });
注意事项
- 以上两种方案都必须在
IServiceCollection.BuildServiceProvider()执行前调用,容器构建完成后无法再通过DI配置的方式追加消费者。 - 如果必须在容器构建、总线启动后动态挂载消费者,可以调用
IBusControl的ConnectConsumer方法实现,但该方式挂载的消费者不受DI容器生命周期管理,需要自行处理实例创建、释放逻辑:
var bus = serviceProvider.GetRequiredService<IBusControl>(); // 手动挂载消费者 bus.ConnectConsumer<ConsumerOfModule2>(serviceProvider); await bus.StartAsync();
内容的提问来源于stack exchange,提问作者mami
相关产品推荐
相关产品推荐

