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

閉鎖がキャプチャします変数への参照。引数を渡すためには正しく動作するはずです。その後、それは動作するはずです!

関連する問題