65.9K
CodeProject 正在变化。 阅读更多。
Home

用于插件组件的应用程序框架 - 第二部分 - 通知事件

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (5投票s)

2005年6月16日

3分钟阅读

viewsIcon

18857

downloadIcon

548

本文介绍如何从插入框架的组件触发事件到框架。

Sample Image - FrameworkEvents.gif

引言

应用程序框架插件组件 - 第一部分 已经解释了如何构建可插入到框架的组件以及如何调用此类组件中的方法。 在典型的组件中,组件本身必须启动并调用其框架中的方法。 本文介绍如何使用接口来回调框架中的函数。

它是如何工作的....

正如我在之前的文章中所述,代理 DLL 包含接口,这些接口构建了框架和组件之间的桥梁。 为了处理事件,代理 DLL 必须声明一个接口,该接口描述了框架应该收到的所有可能的事件通知。 这个描述框架中回调函数的接口在应用程序框架中实现并实例化。 并且使用 .NET 反射将对此对象实例的引用传递给相关的组件。 通过引用框架中的对象实例,组件可以调用该对象实例中的任何方法,这些方法驻留在应用程序框架中。

使用代码

演示项目使用接口对两个整数实现简单的数学运算。 尝试将数字除以零时会触发一个事件,同时,窗体上有一个按钮可以模拟组件上的事件。

MathProxy.dll 由两个接口组成,分别是 IMathIMathEvent。顾名思义,IMathEvent 描述了在应用程序框架中调用的事件的函数原型。 在这里,CalcErrorEvent 是接口中唯一的函数,它只是将一个字符串传递给框架。

public interface IMath
{
    int CalcValues(int iValue1, int iValue2);
}

public interface IMathEvent
{
    void CalcErrorEvent(string s);
}

IMathEvent 接口在应用程序框架中作为 MathEvent 类实现。 MathEvent 有一个来自父类的成员,它是应用程序框架的中心位置。 这只是为了从事件接口访问框架。 这是类实现

public class MathEvents : IMathEvent
{
    public frmIntfDemo m_form;
    void IMathEvent.CalcErrorEvent(string s)
    {
        m_form.txtEventMsg.Text = s;
    }
}

frmIntfDemo 在此时是应用程序框架,它具有 MathEvent 类型的成员。 MathEvent 类在 frmIntfDemo 的构造函数中实例化,并且对启动模块的引用保存在 MathEvent 类中。

m_mathEvent = new MathEvents();
m_mathEvent.m_form = this;

现在,让我们看看组件是如何创建的。 在这里我使用了 CreateEx 而不是 Create 只是为了将此实现与之前的文章的实现区分开来。 CreateIntf 有三个静态成员,分别是 m_MathEventm_divm_ComponentUI。 这些成员保存对在应用程序框架中创建的 MathEvent 实例、实现 IMath 接口的 Div 类实例以及用于模拟组件事件的窗体实例的引用。(这里 frmComponentUI 的唯一目的是通过用户交互启动事件。)

public class CreateIntf
{
    static IMathEvent m_MathEvent;
    static Div m_div;
    static frmComponentUI m_ComponentUI;
    static public IMath CreateEx(IMathEvent mathEvent)
    {
        m_MathEvent = mathEvent;
        m_div = new Div();
        m_div.m_Events = m_MathEvent;

        m_ComponentUI = new frmComponentUI();
        m_ComponentUI.m_mathEvent = m_MathEvent;
        m_ComponentUI.Show();
        return m_div;
    }
}

Div 类实现了 IMath 接口,并且还引用了应用程序框架中的 IMathEvent 实现 (MathEvent)。 如果我们仔细观察 CalcValues 的实现,您可以看到,当分母为零时,该函数会调用 IMathEvent 接口的 CalcErrorEvent。 这会通知应用程序框架发生被零除错误。

public class Div : IMath
{
    public IMathEvent m_Events;
    int IMath.CalcValues(int iValue1,int iValue2)
    {
        int iRes=0;
        if ( iValue2 == 0 )
            m_Events.CalcErrorEvent( "Device by Zero Error" );
        else
            iRes = iValue1 / iValue2;

        return iRes;
    }
}

frmComponentUI 中,btnSimulate_Click 包含模拟 CalcErrorEvent 的代码。

private void btnSimulate_Click(object sender, System.EventArgs e)
{
    m_mathEvent.CalcErrorEvent( "Error event simulate by Component UI" );
}

结论

本文连同 应用程序框架插件组件 - 第一部分 描述了如何构建一个简单的应用程序框架,该框架可以使用 .NET 反射和接口在运行时插入组件。

© . All rights reserved.