2016-08-09 2 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}); 
    } 
} 

상기 MessageRequestClient 생성자에 걸쳐 통과 IBusControl의 인스턴스에 대한 참조를 얻을 수있는 메커니즘은 무엇입니까?

답변

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

폐쇄 캡처해야 변수에 대한 참조이며, 인수를 전달할 때 제대로 작동해야합니다. 그럼, 작동합니다!

관련 문제