在 C# 中获取事件以处理公共数据对象
本文关键字:处理 公共数据 对象 事件 获取 | 更新日期: 2023-09-27 18:35:28
我在 C# 中实现事件体系结构时遇到了一些问题。基本布局是这样的:
我们有一个与服务器通信的网络层(dll)。该层为数据库中的更改事件提供了多个接口。数据库字段更改,dll 调用我的相应接口的实现。我有一个GUI,在它的主要方法中有一个数据对象,它存储我显示的临时数据列表,直到我的用户更改某些内容,在这种情况下,我会将更改发送到数据库。
现在的问题是我无法在网络层中实现事件处理程序,或者我无法实现其接口,因为我的数据对象(应该获取事件的结果)仅存在于我的 GUI 中,并且它是 main 方法,因此不知道适当的对象。
我将以伪代码为例:
命名空间客户端连接{ public class DataListener : IDataListener { public delegate void SomethingReceivedHandler(对象发送者,SomethingData packet); 公共事件 SomethingReceivedHandler somethingReceivedevedHandler; 公共无效 某物接收(某物数据包) { if (SomethingRecievedHandler != null) { SomethingRecievedHandler(this,packet); } }
是我当前实现的接口。该图层类似于:
私有 void ProcessPacket(SomethingData packet) { 如果(数据包 == 空) 返回; 尝试 { 如果(数据包是某事数据) DataListener.SomethingReceived(packet as SomethingData);剪 断
我的主要方法是:
公共部分类 主 : 窗体主 { 数据客户端数据;包含 GUI 中的所有临时数据 public frmMain() { 客户端数据 = 新数据(); DataListener dataListener = newDataListener(); 初始化组件(); }
如果事件触发,我想执行以下操作: ClientData.SomeList.Add(packet)
取决于上下文。
现在的问题是我无法在网络层中实现事件处理程序,或者我无法实现其接口,因为我的数据对象(应该获取事件的结果)仅存在于我的 GUI 中,并且它是 main 方法,因此不知道适当的对象。
不确定我是否看到问题。事件的发布者不需要知道有关事件订阅者的任何信息,这就是它们有用的原因。
根据您的伪代码,它应该像以下那样简单:
public partial class Main : FormMain
{
Data ClientData; //Contains all temporary data within the GUI
public frmMain()
{
ClientData = new Data();
DataListener dataListener = new DataListener();
// Add an event handler
dataListener.somethingReceivedHandler +=
(object sender, SomethingData packet)
{
if (someContext) ClientData.SomeList.Add(packet);
};
InitializeComponent();
}
您可能希望将dataListener
提升到字段(而不是本地字段),以便它在 ctor 之外保持活动状态(您可以在表单关闭时取消订阅)。