我最近试图实现自己的简单事件聚合器。我从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);
仅仅是不同事件枚举类型的容器。
答案 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
通过这种方式,您可以精确定义通知模型的粒度。