2016-08-09 3 views
0

Я пытаюсь инициировать запрос/ответ в методе Consumer.Consume и изо всех сил пытаюсь заполнить параметр шины.Инициировать шаблон запроса/ответа внутри потребителя

public class DeleteUserConsumer : IConsumer<IDeleteUser> 
{ 
    public async Task Consume(ConsumeContext<IDeleteUser> context) 
    { 
     var address = "rabbitmq://host/vhost/queue" 
     var timeout = TimeSpan.FromSeconds(15); 
     var bus = context.??? // was hoping to get an IBusControl instance from the context - but perhaps this isn't possible? 

     IRequestClient<IGetUserDetails,IUserDetails> client = new MessageRequestClient<IGetUserDetails, IUserDetails>(bus, address, timeout); 
     var userDetails = await client.Request(new IGetUserDetails() {Name = context.Message.Name}); 
    } 
} 

Игнорирование произвольный пример, есть ли механизм, чтобы получить ссылку на экземпляр IBusControl пройти через конструктору MessageRequestClient?

ответ

1

Я бы предложил следующие шаги, чтобы добраться до счастливого места с вашим кодом.

Во-первых, обновить свой класс, чтобы принять IBus аргумент:

public class DeleteUserConsumer : 
    IConsumer<IDeleteUser> 
{ 
    IBus _bus; 

    public DeleteUserConsumer(IBus bus) 
    { 
     _bus = bus; 
    } 

    public async Task Consume(ConsumeContext<IDeleteUser> context) 
    { 
     var address = "rabbitmq://host/vhost/queue" 
     var timeout = TimeSpan.FromSeconds(15); 

     IRequestClient<IGetUserDetails,IUserDetails> client = new MessageRequestClient<IGetUserDetails, IUserDetails>(_bus, address, timeout); 
     var userDetails = await client.Request(new IGetUserDetails() {Name = context.Message.Name}); 
    } 
} 

Далее обновить потребительскую регистрацию включить фабричный метод для создания потребителя:

IBusControl busControl = null; 
busControl = Bus.Factory.CreateUsingInMemory(x => 
{ 
    x.ReceiveEndpoint("my_service", e => 
    { 
     e.Consumer(() => new DeleteUserConsumer(busControl)); 
    }) 
}) 

Затвор должен захватить ссылку на переменную, и она должна работать правильно, чтобы передать аргумент. Тогда это должно сработать!

Смежные вопросы