Агрегатор событий Prism. Получите событие и отправьте его снова

В моем проекте есть три ViewModel (например, ViewModelA, ViewModelB и ViewModelC).
Мне нужно написать следующую логику.
ViewModelA отправляет значение в ViewModelB, используя EventAggregator из Prism.
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.


person Boris Makhlin    schedule 31.05.2020    source источник


Ответы (1)


Агрегатор событий работает таким образом, что каждый может прослушать каждое событие. Итак, если вы хотите отправить из A в B (а затем из B в C), вам нужны два отдельных «частных» события.

A:

 eventAggregator.Publish<AtoB>( value );

B:

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

C:

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

Примечание: вы публикуете и подписываетесь на тип события, а не на тип полезной нагрузки. Название вашего события (EventData) немного неудобно, потому что его можно спутать с полезной нагрузкой. Лучшее имя было бы DataEvent... или, здесь, RawDataEvent и ProcessedDataEvent.

Примечание 2: очевидно, что агрегатор событий не предназначен для нерассылаемых сообщений. Вы можете форсировать это (используя разные типы событий или, например, включив идентификатор получателя в полезную нагрузку), но я бы предпочел систему обмена сообщениями, предназначенную для двухточечных сообщений.

person Haukinger    schedule 31.05.2020