棱镜事件聚合器。接收事件并再次发送

Prism EventAggregator. Receive the event and send it again

在我的项目中,我有三个 ViewModel(例如,ViewModelAViewModelBViewModelC)。
我需要编写如下逻辑。
ViewModelA 使用来自 Prism 的 EventAggregator 将值发送到 ViewModelB
ViewModelB 接收值并将其发送到 ViewModelC.
ViewModelC 接收值并做某事。

代码如下:

// The data that will be send using the event aggregator.
class EventData : PubSubEvent<int>
{ 
}

class ViewModelA
{
    IEventAggregator m_eventAggregator;

    public ViewModelA(IEventAggregator eventAggregator)
    {
        m_eventAggregator = eventAggregator;

        // Publish some value.
        eventAggregator.GetEvent<EventData>().Publish(10);
    }
}

class ViewModelB
{
    IEventAggregator m_eventAggregator;

    public ViewModelB(IEventAggregator eventAggregator)
    {
        m_eventAggregator = eventAggregator;

        eventAggregator.GetEvent<EventData>().Subscribe(OnDataReceived);
    }

    void OnDataReceived(int value)
    {
        // Here I want to send the value to the ViewModelC. How can I do it?
    }
}

PS:是大项目的一部分。所以,请不要直接从 ViewModelA 发送到 ViewModelC,没有 ViewModelB.

事件聚合器的工作方式是每个人都可以收听每个事件。所以,如果你想从 A 发送到 B(然后从 B 到 C),你需要两个不同的 "private" 事件。

甲:

 eventAggregator.Publish<AtoB>( value );

乙:

 eventAggregator.Subscribe<AtoB>( x => {
                                           var y = process(x);
                                           eventAggregator.Publish<BtoC>( y );
                                       } );

C:

 eventAggregator.Subscribe<BtoC>( x => whatever( x ) );

旁注:您发布和订阅的是事件类型,而不是负载类型。您的事件 (EventData) 的命名有点尴尬,因为人们会将它与有效载荷混淆。更好的名称是 DataEvent... 或者,这里是 RawDataEventProcessedDataEvent.

旁注 2:显然,事件聚合器不适用于非广播消息。您可以强制执行它(使用不同的事件类型,或者,例如,通过在有效负载中包含目标 ID),但我更喜欢专为点对点消息设计的消息传递系统。