3

我最近尝试实现自己的简单事件聚合器。我从 MSDN 上的事件聚合器文章中获得了很多灵感。关于 MSDN 上的事件聚合器,我注意到一件事是事件实际上是它们自己的类。这根本不是一件坏事。但是,我只是觉得总是为每个小事件创建一个新的空类很尴尬。

我觉得这很尴尬的原因是因为需要为每个细粒度事件创建一个类。例如,鼠标单击事件将具有 double_click、single_click、left_click、right_click 等。所有这些都会有自己的类。一段时间后它会变得混乱。

所以在我自己的实现中,我认为我可以以这样的方式实现,其中ClickEvent是一个类,但与 Click 事件相关的所有粒度事件都将是ClickEvent. 在这种情况下,“类型”是enum. 用法如下所示:

//Publisher
eventAggregator.GetEvent<ClickEvent>.Publish(ClickEventType.Double_Click, eventArgs);

//Subscriber
eventAggregator.GetEvent<ClickEvent>.Subscribe(ClickEventType.Double_Click, handlerMethod);

但是,我不确定这个实现是否违背了拥有强类型事件的全部目的?现在,它似乎ClickEvent只是不同事件枚举类型的容器。

4

2 回答 2

3

是的(看起来像一个容器) - 无论点击类型如何,您的处理程序都会触发,并且处理程序中需要一些代码来确定点击类型,这会使事情变得有点混乱。

如果您的问题主要是文件/类的组织并保持代码整洁,为什么不将点击事件创建为主点击类中的嵌套类

例如

public static class ClickEvents // Prevent instantiation
{
    public class SingleLeft { }
    public class SingleRight { }
    public class DoubleLeft { }
    public class DoubleRight { }
    // Are there any more click events possible?!
}

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Publish();

除此之外,决定事件签名的是类型的唯一性,因此需要多种类型来满足这个特定的实现

至少以上内容可以使您的处理程序代码保持干净

void HandleLeftClick()
{
}

对比

void HandleClick(ClickArgs e) 
{
    if(e.ClickType == ClickType.Left)
    {
    }
}

编辑:

还要记住,如果您想处理多个点击类型,您可以将多个事件订阅到同一个处理程序:

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Subscribe(HandlerMethod);
eventAggregator.GetEvent<ClickEvents.SingleRight>.Subscribe(HandlerMethod);

(这在订阅者不关心单击哪个鼠标按钮的罕见情况下有效)

于 2012-12-12T21:18:16.393 回答
0

我想你错过了一种可能性。你看,你不必为每个通知创建一个新类。相反,您可以自由地重用类,但在内部携带一些任意复杂性的额外状态。

public class MouseClickNotification {

    public bool IsDoubleClick;
    public MouseButton ClickedButton;

    // any additional stuff

这样,您就可以精确定义通知模型的粒度。

于 2012-12-12T21:17:19.013 回答