es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo pasar IBus al constructor del consumidor de masstransit

¡Buen día!

Me estoy registrando como consumidor de masstransit de esta manera:

var provider = services.BuildServiceProvider();

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

y quiero que mi consumidor publique en otro intercambio. ¿Hay alguna forma de obtener IBus desde el proveedor de servicios en el constructor del consumidor? ¿O debo pasar otro parámetro (¿cuál?)?

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

¿Y es esta la forma correcta de crear un mapeador aquí, o también se podría pasar como parámetro?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes obtener IBus del proveedor de servicios en el constructor del consumidor al pasar la interfaz IBusControl como un parámetro al constructor y luego usarlo para crear IBus en el constructor.

    Aquí está el ejemplo modificado:

    public class ConsumerProcessingStatusChange : IConsumer<***>
    {
        private readonly IBus _bus;
        private readonly IMapper _mapper;
    
        public ConsumerProcessingStatusChange(IBusControl busControl)
        {
            _bus = busControl.CreateSendEndpoint(new Uri("exchangeUri")).Result;
            _mapper = new MapperConfiguration(cfg => cfg.AddProfile<mappingprofile>()).CreateMapper();
        }
    
        public async Task Consume(ConsumeContext<***> context)
        {
            await _bus.Publish(_mapper.Map<***>(context.Message));
        }
    }
    

    En este ejemplo, pasamos la interfaz IBusControl como un parámetro al constructor y luego la usamos para crear una instancia de IBus, que luego se utiliza para publicar el mensaje en el intercambio.

    En cuanto al mapeador, es mejor pasarlo como un parámetro al constructor en lugar de crearlo en el constructor para que sea más flexible y testeable.

Comments are closed.