12

为什么我们不能在没有任何 PayLoad 的情况下发布事件。

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

现在,我不需要在这里传递任何有效负载。但是 EventAggregator 实现要求我有一个空类来做到这一点。

事件:

  public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria>
  {
  }

有效载荷:

  public class SelectFolderEventCriteria
  {
  }

为什么 Prism 没有提供一种仅使用 Event 并像这样发布它的方法

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

是设计使然,我不明白吗?请解释。谢谢!

4

2 回答 2

11

好问题,我看不出没有有效负载不发布事件的理由。在某些情况下,已引发事件的事实就是您需要和想要处理的所有信息。

有两种选择:由于它是开源的,因此您可以获取 Prism 源并提取不带有效负载的 CompositePresentation 事件。

我不会那样做,但将 Prism 作为第 3 方库处理并保持原样。为 3rd 方库编写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);
    }
}

如果有什么不清楚的,请询问。

于 2013-03-15T11:35:13.200 回答
2

只是为了更新自从提出/回答了这个问题以来的情况,从 Prism 6.2 开始,Prism PubSubEvents 现在支持空有效负载。

如果您使用的是旧版本,此博客将展示如何创建一个“Empty”类来清楚地表明有效负载的意图:https ://blog.davidpadbury.com/2010/01/01/empty-type-parameters /

于 2016-10-10T16:28:51.170 回答