0

我在用 C# 实现事件架构时遇到了一些问题。基本布局是这样的:

我们有一个与服务器通信的网络层(dll)。该层为数据库内的更改事件创建了几个接口。数据库字段发生更改,dll 调用我对相应接口的实现。我有一个 GUI,在它的主要方法中有一个数据对象,它存储我显示的临时数据列表,直到我的用户更改某些内容,在这种情况下,我会将更改发送到数据库。

现在的问题是我无法在网络层或我的接口实现中实现事件处理程序,因为我的数据对象(应该获取事件的结果)只存在于我的 GUI 中,而且它是main 方法,因此对于适当的对象来说是未知的。

我将以伪代码为例:

命名空间客户端连接
{
    公共类 DataListener : IDataListener
    {
        公共委托无效的SomethingReceivedHandler(对象发送者,SomethingData数据包);
        公共事件 SomethingReceivedHandler somethingRecievedHandler;

        公共无效的SomethingReceived(SomethingData数据包)
        {
            如果(SomethingRecievedHandler != null)
            {
                SomethingRecievedHandler(this, packet);
            }
        }

是我当前的接口实现。该层类似于:

private void ProcessPacket(SomethingData 数据包)
        {
            如果(数据包 == 空)
                返回;
            尝试
            {
                如果(数据包是SomethingData)
                    DataListener.SomethingReceived(packet as SomethingData);
//剪辑

我的主要方法是:

公共部分类 Main : FormMain
    {
        数据客户端数据;//包含GUI中的所有临时数据

        公共 frmMain()
        {
            客户端数据 = 新数据();
            数据监听器 dataListener = newDataListener();
            初始化组件();
        }

如果事件触发,我想做类似的事情: ClientData.SomeList.Add(packet) 取决于上下文。

4

1 回答 1

1

现在的问题是我无法在网络层或我的接口实现中实现事件处理程序,因为我的数据对象(应该获取事件的结果)只存在于我的 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 之外保持活动状态(并且您可以在表单关闭时取消订阅)。

于 2012-05-26T13:02:00.317 回答