让事件在C#中处理公共数据对象

时间:2012-05-26 12:40:31

标签: c# events

我在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) 视情况而定。

1 个答案:

答案 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之外保持活动状态(并且您可以在表单关闭时取消订阅)。