技术开发 频道

基于构件复用的软件方法与COM支持

    自动化对象与其调用者之间参数与返回值的传递,必须在VARIANT的范围之内进行.各种不同种类的VARIANT型参数之间的转换,可以在InVoke中实现.为程序员提供更加智能化的编程界面(如VB中实现的那样).

    COM为所有的组件对象规定了一个必须实现的基接口IUnknown,这不仅定义了最基本的公共服务,而且还使一个指向IUnknown接口的指针客观上成为组件实例的对象标示.除对象生存期的管理外,这种对象标示还使COM组件具有了自解释的特性:通过对Iunknown接口的成员函数QueryInterface的调用可以查询到对象实现的所有接口.

    不过上述自动化的各种优点是以其数据类型的限制和性能的部分损失为代价的.虽然编译器可以通过类型库进行前绑定(参数类型的检查,符号到分发ID的转换),但是最耗时的InVoke却难以优化.为此COM规定了双接口机制,为程序员提供了在动态绑定与静态联编之间选择的自由.同时,自动化技术的存在,也为脚本语言(VBScript, JavaScript)提供了活力.

    三 包容和聚合

    作为面向对象系统的重要特性,COM支持两种重用模型:包容(containment)和聚合(aggregation)它们的思路基本一致,只是在实现方法上有所不同.

    考虑包容的情况,假定已经有一个实现了接口IReuseInterface的COM对象A,由于新的需求,我们又要实现一个新的COM对象B,它既要实现接口IReuseInterface,又要实现接口INewInterface,而且IreuseInterface所提供的服务与对象A的接口基本一致,只要再实现新添加的功能就可完成对象B的开发.最直观的想法就是在对象B的内部"包容"一个对象A的实例.所有对B的接口IreuseInterface成员函数的调用均在其内部简单地转发给对象A,对于B的客户来说,根本无需知道A的存在.

    包容模型在实现时较为灵活,可以再将调用转发给内部对象的前后,进行一些本地化的处理,从而弥补A和B各自IreuseInterface接口在功能上的微小差异.

    依然考虑上面的例子,如果B的IReuseInterface接口在功能上与A实现的完全一致,不需要做任何改动.现在采用聚合模型来实现B.对象B本身并不是实现接口IreuseInterface,它只实现接口InewInterface.当B客户请求IreuseInterface 接口时,对象B把对象A的IreuseInterface接口指针传递给客户程序,因此客户直接与A进行了交互(虽然它并不知道对象A的存在).

    当然,聚合模型在对Iunknown指针的处理上要比包容模型复杂一些.需要进行对象双方的合作,并不是每对象都能支持聚合的特性.但聚合体现了组件软件真正意义上的复用,而包容的重用性只是体现在客户服务器模型相对性的基础上.实际也就是客户程序和组件程序的嵌套关系.这是包容和聚合的本质不同.

    四 统一数据传输和消息传递

    在基于软件复用开发的应用系统中,各分立的组件对象要相互协作来共同完成某一特定任务逻辑.为支持各种可能复杂的协作关系,仅有参数信息的传递是远远不够的,必须提供应用间数据交换的标准方案和事件,消息的通知机制.

    在这两方面,COM均提供了较为成熟的规范.即统一数据传输(UDT,Uniform Data Transfer)和MSMQ.

    众所周知的OLE程序利用剪贴板传输连接对象信息,就是UDT的一种典型应用.统一数据传输建立在结构化存储的基础上,包括两方面的内容:首先是数据格式的统一,其次是传输协议的建立.统一数据传输机制使?quot;数据对象"作为信息实体,通过IDataObject接口暴露其内部信息.由于数据对象本身是一个COM对象,因此它不仅可以表达一般的结构化信息,也可以表达一些非结构化信息.

    传输协议任务就是将一个组件提供的数据对象即IdataObject接口指针传递给另一个组件对象.接收方得到IdataObject接口指针后就可以利用其成员函数获取所需的数据.传输协议的具体实现与数据交换是完全分开的,因此可以在最大限度与原系统保持兼容的情况下,方便的扩充协议.较常见的传输协议包括剪贴板,"拖-放"技术等.另外,为适应一些实时性比较强的应用,COM还提供了"数据变化通?quot;机制,以扩充数据对象与客户程序之间的双向通信.MicroSoft Message Queue(MSMQ)版本1是Windows NT操作系统的一个新特征.MSMQ提供可在不可靠的网络上进行可靠的关键任务信息通信.与大多数现代应用程序用紧密耦合且同步通信相反,MSMQ基于一个消息排队模型来提供一个异步,松散耦合,可靠的网络通信.出于功能复用及标准化的考虑,MSMQ 使用了面向消息的中间件(MOM Message_Oriented Middleware).MOM提供了一个队列和消息的通信基础结构.应用程序向队列写入消息,消息中间件将消息传递给被请求的队列,另一个应用程序(或同一应用程序的另一个组件)从目标队列读取消息并进行处理.消息的内容完全由读写队列的应用程序控制.MSMQ支持大范围的队列类型.公共应用程序队列对MSMQ客户是可见的,因为它们发布在一个命名服务器上,即MQIS(Message Queue Information Store,消息队列信息存储).MSMQ客户能够查询MQIS来确定是否存在某一公共应用程序队列以及它已哪台计算机为主机.另一方面,私有的应用程序队列不在MQIS中发布.因此,想向私有队列发送消息,就必须详细知道此队列的主机.

    五 总结

    企业级应用系统领域中的构件复用,由于有了三层体系结构的支持而变得清晰,明确.在Windows DNA框架中应用系统被分为了表现层,业务层和数据层.其中的业务层又可根据需要分为多个子层.表现层和数据层的重用已经相当标准化了,如各种支持GUI开发的类库,ActiveX控件,OLEDB,ODBC等.构件复用的重点在业务处理层.笔者认为通过对商业世界中各项服务的明确划分,对东服务接口的定义标准化,可以有效地实现体系结构和组件的复用.

0
相关文章