我在C#中实现事件架构时遇到了一些问题。基本布局是这样的:
我们有一个与服务器通信的网络层(dll)。该层为数据库中的更改事件创建了多个接口。数据库字段更改,dll调用我的相应接口的实现。我有一个GUI,在其主要方法中有一个数据对象,它存储我显示的临时数据列表,直到我的用户更改了某些内容,在这种情况下,我会将更改发送到数据库。
现在的问题是我无法在网络层或我的接口实现中实现事件处理程序,因为我的数据对象(应该得到事件的结果)只存在于我的GUI中,它是主要的方法,因此对于相应的对象是不知道的。
我将以伪代码为例:
namespace ClientConnection { public class DataListener : IDataListener { public delegate void SomethingReceivedHandler(object sender, SomethingData packet); public event SomethingReceivedHandler somethingRecievedHandler; public void SomethingReceived(SomethingData packet) { if (SomethingRecievedHandler != null) { SomethingRecievedHandler(this, packet); } }
是我当前实现的界面。 Layer有类似于:
private void ProcessPacket(SomethingData packet) { if (packet == null) return; try { if (packet is SomethingData) DataListener.SomethingReceived(packet as SomethingData); //snip
我的主要方法是:
public partial class Main : FormMain { Data ClientData; //Contains all temporary data within the GUI public frmMain() { ClientData = new Data(); DataListener dataListener = newDataListener(); InitializeComponent(); }
如果事件发生,我想做类似的事情:
ClientData.SomeList.Add(packet)
视情况而定。
答案 0 :(得分:1)
现在的问题是我无法在网络层或我的接口实现中实现事件处理程序,因为我的数据对象(应该得到事件的结果)只存在于我的GUI中,它是主要的方法,因此对于相应的对象是不知道的。
不确定我是否看到了问题。该活动的发布者不需要知道关于活动订阅者的任何信息 - 这就是使它们有用的原因。
根据您的伪代码,它应该如下:
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之外保持活动状态(并且您可以在表单关闭时取消订阅)。