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

标签 c# events design-patterns eventaggregator

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

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

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

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

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

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

最佳答案

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

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

例如

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);

(这在订阅者不关心点击了哪个鼠标按钮的极少数情况下有效)

关于c# - 在事件聚合器中将枚举与事件类混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13848621/

相关文章:

c# - WinForms:寻找一种简单的方法来弹出 'Processing..' 面板

c# - 使用子类对象列表分配父类引用列表不起作用

javascript - 如何捕获 Bootstrap 导航栏下拉事件?

javascript - Firefox 缺少 window.event 的解决方法?

multithreading - 我的 “design pattern”用于异步方法好吗?

design-patterns - 使用MVC建立 object 的阶层 list

c# - .NET 等同于 Java FileChannel?

c# - 在 Windows Phone 上实现可滚动表

ios - 屏幕左/左下角的 UINavigationController 和触摸事件

web-services - 编码架构问题