Опубликовать событие без PayLoad в EventAggregator Prism?

Почему мы не можем публиковать события без PayLoad.

    _eventAggregator.GetEvent<SelectFolderEvent>().Publish(new SelectFolderEventCriteria() { });

Теперь мне не нужна никакая зарплата, которую нужно передать здесь. Но реализация EventAggregator требует, чтобы у меня был пустой класс.

Событие:

  public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria>
  {
  }

Полезная нагрузка:

  public class SelectFolderEventCriteria
  {
  }

Почему Prism не предоставил способ использовать только событие и опубликовать его как

    _eventAggregator.GetEvent<SelectFolderEvent>().Publish();

Это по дизайну, и я не понимаю? Пожалуйста, объясни. Спасибо!

Ответ 1

Хороший вопрос, я не вижу причины для публикации события без полезной нагрузки. Бывают случаи, когда факт, что событие было поднято, - это вся информация, которая вам нужна и которую нужно обработать.

Есть два варианта: поскольку он является открытым исходным кодом, вы можете взять источник Prism и извлечь событие CompositePresentation, которое не принимает полезную нагрузку.

Я бы этого не сделал, но обрабатываю Prism как стороннюю библиотеку и оставляю ее как есть. Хорошая практика - написать Facade для сторонней библиотеки, которая поместит ее в ваш проект, в этом случае для CompositePresentationEvent. Это может выглядеть примерно так:

public class EmptyPresentationEvent : EventBase
{
    /// <summary>
    /// Event which facade is for
    /// </summary>
    private readonly CompositePresentationEvent<object> _innerEvent;

    /// <summary>
    /// Dictionary which maps parameterless actions to wrapped 
    /// actions which take the ignored parameter 
    /// </summary>
    private readonly Dictionary<Action, Action<object>> _subscriberActions;

    public EmptyPresentationEvent()
    {
        _innerEvent = new CompositePresentationEvent<object>();
        _subscriberActions = new Dictionary<Action, Action<object>>();
    }

    public void Publish()
    {
        _innerEvent.Publish(null);
    }

    public void Subscribe(Action action)
    {
        Action<object> wrappedAction = o => action();
        _subscriberActions.Add(action, wrappedAction);
        _innerEvent.Subscribe(wrappedAction);
    }

    public void Unsubscribe(Action action)
    {
        if (!_subscriberActions.ContainsKey(action)) return;
        var wrappedActionToUnsubscribe = _subscriberActions[action];
        _innerEvent.Unsubscribe(wrappedActionToUnsubscribe);
        _subscriberActions.Remove(action);
    }
}

Если что-то неясно, спросите.

Ответ 2

Чтобы обновить ситуацию, так как этот вопрос был задан/ответил, как и в Prism 6.2, теперь в Prism PubSubEvents теперь поддерживаются пустые полезные нагрузки.

Если вы используете более старую версию, этот блог показывает, как создать "пустой" класс, который четко указывает на намерение полезной нагрузки: https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/