我最近尝试实现自己的简单事件聚合器。我从 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/