【问题标题】:How to pass IBus to masstransit consumer constructor如何将 IBus 传递给公共交通消费者构造函数
【发布时间】:2021-12-05 19:40:40
【问题描述】:

美好的一天

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

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));
        }

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

【问题讨论】:

    标签: c# masstransit consumer


    【解决方案1】:

    您不需要注入IBus,这不是链接消息的推荐方法。你应该改用context.Publish,它不仅会发布你的消息,而且还会在这些消息之间建立一个具有适当因果关系和对话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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2012-05-17
      相关资源
      最近更新 更多