在事件聚合器中将枚举与事件类混合

时间:2012-12-12 21:05:59

标签: c# events design-patterns eventaggregator

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

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

所以在我自己的实现中,我认为我可以以ClickEvent是一个类的方式来创建它,但是与Click事件相关的所有粒度事件都将是{{的“类型” 1}}。在这种情况下,“类型”是ClickEvent。用法看起来像这样:

enum

但是,我不确定这种实现是否会破坏强类型事件的整个目的?现在,似乎//Publisher eventAggregator.GetEvent<ClickEvent>.Publish(ClickEventType.Double_Click, eventArgs); //Subscriber eventAggregator.GetEvent<ClickEvent>.Subscribe(ClickEventType.Double_Click, handlerMethod); 仅仅是不同事件枚举类型的容器。

2 个答案:

答案 0 :(得分:3)

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

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

e.g。

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()
{
}

VS

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

编辑:

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

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

(这可以在订户不关心单击哪个鼠标按钮的罕见情况下工作)

答案 1 :(得分:0)

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

public class MouseClickNotification {

    public bool IsDoubleClick;
    public MouseButton ClickedButton;

    // any additional stuff

通过这种方式,您可以精确定义通知模型的粒度。