如何将 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
。
美好的一天
我正在以这种方式注册公共交通消费者:
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
。