如何将 IBus 传递给公共交通消费者构造函数

How to pass IBus to masstransit consumer constructor

美好的一天

我正在以这种方式注册公共交通消费者:

var provider = services.BuildServiceProvider();

cfg.ReceiveEndpoint(RabbitMqOptions.StatusChangeQueueName, e =>
{
e.Consumer(() => new ConsumerProcessingStatusChange(provider));
});

并希望我的消费者发布到另一个交易所 有没有办法在消费者构造函数中从服务提供者那里获取 IBus? 或者我应该传递其他参数(哪个?)

public class ConsumerProcessingStatusChange : IConsumer<***>
    {
        private readonly IBus _bus;
        private readonly IMapper _mapper;

        public ConsumerProcessingStatusChange(IServiceProvider provider)
        {
            _bus = provider.GetService<IBus>();
            _mapper = new MapperConfiguration(cfg => cfg.AddProfile<MappingProfile>()).CreateMapper();
        }

        public async Task Consume(ConsumeContext<***> context)
        {
            await _bus.Publish(_mapper.Map<***>(context.Message));
        }

在这里创建映射器是正确的方法还是也可以通过?

您不需要注入 IBus,这不是链接消息的推荐方法。您应该改用 context.Publish,它不仅会发布您的消息,还会在这些消息之间建立一个 link 并具有适当的因果关系和对话 ID。

此外,注入服务提供者是一种服务定位器反模式。我建议至少阅读 DI docs from Microsoft 以了解应该如何完成。

如果您按照 documentation 配置您的应用程序,您将在实例化消费者时注入您的依赖项。特别是,这个例子展示了它是如何完成的:

 services.AddMassTransit(x =>
 {
     x.AddConsumer<EventConsumer>();
     x.UsingRabbitMq((context, cfg) =>
     {
         cfg.ReceiveEndpoint("event-listener", e =>
         {
             e.ConfigureConsumer<EventConsumer>(context);
         });
     });
 });

像这样配置后,EventConsumer 实例将正确注入所有依赖项(如果有的话),并且这些依赖项已在服务集合中正确注册。

但仍然,要从消费者内部发布消息,你最好使用context.Publish