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





2.00/5 (5投票s)
2005年6月16日
3分钟阅读

18857

548
本文介绍如何从插入框架的组件触发事件到框架。
引言
应用程序框架插件组件 - 第一部分 已经解释了如何构建可插入到框架的组件以及如何调用此类组件中的方法。 在典型的组件中,组件本身必须启动并调用其框架中的方法。 本文介绍如何使用接口来回调框架中的函数。
它是如何工作的....
正如我在之前的文章中所述,代理 DLL 包含接口,这些接口构建了框架和组件之间的桥梁。 为了处理事件,代理 DLL 必须声明一个接口,该接口描述了框架应该收到的所有可能的事件通知。 这个描述框架中回调函数的接口在应用程序框架中实现并实例化。 并且使用 .NET 反射将对此对象实例的引用传递给相关的组件。 通过引用框架中的对象实例,组件可以调用该对象实例中的任何方法,这些方法驻留在应用程序框架中。使用代码
演示项目使用接口对两个整数实现简单的数学运算。 尝试将数字除以零时会触发一个事件,同时,窗体上有一个按钮可以模拟组件上的事件。
MathProxy.dll 由两个接口组成,分别是 IMath
和 IMathEvent
。顾名思义,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_MathEvent
、m_div
和 m_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 反射和接口在运行时插入组件。