C# 事件驱动通信的设计问题

C# 事件驱动通信的设计问题,c#,events,event-handling,C#,Events,Event Handling,我在设计问题上有点纠结。我正在用c#制作一个非常简单的gui系统。代码是可重用的,所以我在这里寻找最灵活的解决方案。我提出的解决方案似乎都有缺点 为了简单起见,让我们假设有三个类:控制器、按钮和客户机代码。客户机代码是使用gui系统的代码。它创建控制器并对其调用Update()。控制器创建一组按钮实例并对其调用Update()。按钮自行绘制并检查鼠标单击 现在的问题是,我如何得到一个按钮被点击到客户端代码的事实 选项1:将GetButton(字符串名称)添加到控制器类。然后,客户端代码可以订阅b

我在设计问题上有点纠结。我正在用c#制作一个非常简单的gui系统。代码是可重用的,所以我在这里寻找最灵活的解决方案。我提出的解决方案似乎都有缺点

为了简单起见,让我们假设有三个类:控制器、按钮和客户机代码。客户机代码是使用gui系统的代码。它创建控制器并对其调用Update()。控制器创建一组按钮实例并对其调用Update()。按钮自行绘制并检查鼠标单击

现在的问题是,我如何得到一个按钮被点击到客户端代码的事实

选项1:将GetButton(字符串名称)添加到控制器类。然后,客户端代码可以订阅button类=>GetButton(“but”)中定义的事件;这样做的缺点是,它会公开Button.Update(),该按钮仅由控制器使用

选项2:让控制器订阅所有按钮,客户端代码订阅控制器。这里的缺点是客户端代码中有更多的解析代码,因为现在所有事件都通过控制器传递,所以客户端必须检查每个事件发送到哪个按钮。我更喜欢在初始化阶段设置事件流,如选项1所示

选项3:为每个事件向控制器添加订阅/取消订阅方法(SubscribeMouseUp(string buttonName,GUIDelegate del)等)。缺点是控制器api增长很快

所以现在我倾向于选项1,但是GetButton返回一个只声明事件的接口(可能是IClientButton),从而对客户端隐藏Update(),但是我不确定接口是否应该这样使用

任何见解都值得赞赏。
Bas

这可能是一个问题,因为
Update()
是公共的


假定您已将按钮和控制器组织到同一名称空间,则使用
内部
保护是否适合您的需要?

接口可以这样使用,INotifyPropertyChanged是一个带有1项的interace,该项是一个事件


使用怎么样?

还有第四个,也许更流行的选项

将调度程序作为注册/注销的中心位置。所有事件接收器都向调度程序注册回调。所有事件生成器都将其事件发送给调度程序


它使API保持干净,并有助于解开对象引用的纠缠。

在控制器中,添加两个事件-
按钮创建
按钮选择

public event EventHandler<ClientButtonEventArgs> ButtonCreated;
public event EventHandler<ClientButtonEventArgs> ButtonDestroyed;
已创建公共事件事件处理程序按钮;
已选择公共事件处理程序按钮;
ClientButtonEventArgs
只是
IClientButton
界面周围的一个
EventArgs
包装器

让您的客户端代码订阅这两个事件。当控制器创建一个新按钮时,让它触发
ButtonCreated
事件。然后,客户端代码可以在收到事件通知时订阅必要的按钮事件。类似地,控制器将根据需要触发
ButtonDestroyed
事件,允许客户端代码取消订阅按钮的事件

这样,整个序列都是事件驱动的。客户端代码会对按钮的创建和销毁做出反应,这似乎就是您所追求的