EventAggregator confirmation

本文关键字:confirmation EventAggregator | 更新日期: 2023-09-27 18:12:27

我想知道是否有一种方法可以从单个方法内发布的事件中获得结果。我有一个wcf服务,下面是它的一个方法的实现:

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

正如您所看到的,我的wcf方法返回的结果通知调用者是否发生了错误。我可以在发布事件之前做一些错误处理,但如果在DisplayMessageEvent订阅者端发生了什么,我也想返回关于此的结果。通常我会做一些像DisplayMessageConfirmationEvent和从订阅者发送此事件到发布者,但如何在单个方法内做到这一点?换句话说,基本上我想做的是发布事件,等待来自订阅者的结果并将其返回给WCF调用者。什么好主意吗?

EventAggregator confirmation

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));
     var result = new TaskCompletionSource<Result>();
     eventAggregator.GetEvent<DisplayMessageAnswerEvent>().Subscribe( x => result.SetResult( x ) );
     return result.Result;
}

其中DisplayMessageAnswerEventPubSubEvent<Result>

请注意,原始事件的订阅者必须总是发送答案,否则您将永远被卡住。