2016-10-11 4 views
1

公開されたイベントの結果を単一の方法で取得する方法があるのだろうかと思います。 私は、WCFサービスを持っており、ここではその方法の一つの実装です:あなたは私のWCFメソッドはエラーが発生したかどう呼び出し側に通知した結果を返す見ることができるようにEventAggregatorの確認

public Result DisplayMessage(string message) 
{ 
    // some error handling 
    if(errorOccurred) 
    { 
     return new Result { IsError = true, ErrorMessage = "error occurred"} 
    } 

    eventAggregator.GetEvent<DisplayMessageEvent>().Publish(new DisplayMessageEventArg(message)); 

    return new Result { IsError = false, ErrorMessage = String.Empty }; 
} 

。イベントを公開する前にいくつかのエラー処理を行うことができますが、DisplayMessageEventサブスクライバ側で何か問題が発生した場合は、これについての結果も返す必要があります。通常はDisplayMessageConfirmationEventのような処理を行い、サブスクライバからこのイベントをパブリッシャに送信しますが、これを単一のメソッドで行う方法はありますか? つまり、基本的には、イベントを公開し、サブスクライバからの結果を待ってWCFの呼び出し元に返すことです。何か案は?

答えて

2

EventAggregatorは火災と忘れのメッセージ専用です。おそらく、あなたは結果を伴うメッセージをサポートする他の種類のメッセージングシステムを使いたいと思うでしょう。言われていること

、あなたは別のイベントを待ってから、あなたの方法を続けることができます。DisplayMessageAnswerEventPubSubEvent<Result> ...

元のイベントの加入者があることに注意してくださいされて

public Result DisplayMessage(string message) 
{ 
    // some error handling 
    if(errorOccurred) 
    { 
     return new Result { IsError = true, ErrorMessage = "error occurred"} 
    } 

    eventAggregator.GetEvent<DisplayMessageEvent>().Publish(new DisplayMessageEventArg(message)); 

    var result = new TaskCompletionSource<Result>(); 
    eventAggregator.GetEvent<DisplayMessageAnswerEvent>().Subscribe(x => result.SetResult(x)); 

    return result.Result; 
} 

はいつも答えを送っています。さもなければ、あなたは永遠に立ち往生しています。

+0

ありがとう、これは私がしたいと正確に動作します。回答としてマーク。あなたが「他のメッセージングシステム」について言及した好奇心から、いくつかの例を私に提供できますか?私はライブラリについての簡単なリストを意味するので、それらについて読むことができます。 – SteppingRazor

+1

そこにはたくさんのものがありますが、これは本当に必要なものによって決まります。 1つのプロセス、1つのマシン上の複数のプロセス、複数のマシン上の複数のプロセス、フェイルオーバーなどのクラスタ機能...これは少し古いですが、いくつか含まれています:http://stackoverflow.com/questions/1545442/net-service-bus - 勧告 – Haukinger