现在的位置: 首页 > 综合 > 正文

全面理解COM+

2013年12月02日 ⁄ 综合 ⁄ 共 6213字 ⁄ 字号 评论关闭
我们从各种媒体对Windows 2000的介绍可以看到,在Windows 2000众多新的功能和特性之中,对于开发人员来说,COM+是最值得关注的一个焦点。在Windows 2000Beta版本中,我们已经看到了COM+的面貌,也感受到了COM+将带给我们程序设计和开发过程中思路上的变化。本文旨在从技术的角度对COM+作一个基本的介绍,以便开发人员更好地了解COM+
COM+并不是COM的新版本,我们可以把它理解为COM的新发展,或者为COM更高层次上的应用。COM+的底层结构仍然以COM为基础,它几乎包容了COM的所有内容。有一种说法这样认为,COM+COMDCOMMTS(Microsoft Transaction Server)的集成,这种说法有一定的道理,因为COM+确实综合了这些技术要素。但更重要的一点是,COM+倡导了一种新的概念,它把COM组件软件提升到应用层而不再是底层的软件结构,它通过操作系统的各种支持,使组件对象模型建立在应用层上,把所有组件的底层细节留给操作系统,因此,COM+与操作系统的结合更加紧密,这也是COM+非得等到Windows 2000发布才能面世的主要原因。
我们知道,COM是个开放的组件标准,它有很强的扩充和扩展能力,从COMDCOM,再到MTS的发展过程也充分说明了这一点。对COM有使用经验的读者一定可以感觉到,虽然COM已经改变了Windows程序员的应用开发模式,把组件的概念融入到Windows应用中,但是由于种种原因,DCOMMTS的许多优越性还没有为广大的Windows程序员所认识。MTS针对企业应用和Web应用的特点,在COM/DCOM的基础上又添加了许多功能和特性,包括事务特性、安全模型、管理和配置等,MTS使COM成为一个完整的组件体系结构。由于历史的原因,COMDCOMMTS相互之间并不很融洽,难以形成统一的整体,不过,这种状况很快就要结束,因为COM+将把这三者有效地统一起来,形成一个全新的、功能强大的组件体系结构,并且把DCOMMTS的各种优势以更为简捷的方式带给Windows 2000程序员和用户。
本文分四个部分,第一部分介绍COM+的基本结构;第二部分介绍COM+提供的一些系统服务;第三部分讲述COM+应用开发模型;第四部分介绍COM+的特性并作简要总结。通过阅读这些内容,读者可以看到,COM+将带给我们一些什么样的程序设计概念,它和Windows 2000将如何改变我们的应用,如何改变应用的开发模式。
COM+不再局限于COM的组件技术,它更加注重于分布式网络应用的设计和实现,已经成为Microsoft系统平台策略和软件发展策略的一部分。COM+继承了COM几乎全部的优势,同时又避免了COM实现方面的一些不足。COM+紧紧地与操作系统结合起来,通过系统服务为应用程序提供全面的服务,这一部分介绍COM+的基本结构。
在介绍COM+结构之前,我们首先看看Microsoft推出的Windows DNA(Distributed interNet Application Architecture)策略,因为COM+将在DNA策略中扮演重要的角色。Windows DNAMicrosoft多年积累下来的技术精华集合起来而形成一个完整的、多层结构的企业应用总体方案,它使Windows真正成为企业应用平台。
熟悉MTS的读者一定知道,MicrosoftMTS的基础上提出了多层软件结构的概念。从大的方面来讲,一个企业应用或者分布式应用可以分为表现层、业务层和数据层。表现层为应用的客户端部分,它负责与用户进行交互;业务层构成了应用的业务逻辑规则,它是应用的核心,通常由一些MTS组件构成;数据层为后台数据库,它既可以位于专用的数据服务器,也可以与业务层在同一台服务器上。MTS主要位于中间层,它为业务组件提供了一个运行和管理的统一环境。图1(a)显示了这种多层结构的技术组成模型。
Windows DNA是一个简化了的三层结构,如图1(b)所示。
     (a) 三层结构技术组成模型               (b) Windows DNA结构
1
在现有的系统平台以及软件开发工具条件下,为了实现多层结构的企业应用,我们必须使用各种分离的技术,开发人员要学习每一种软件技术,包括使用Win32 API以及系统提供的一些服务。图1(a)列出了某些可能用到的软件或者技术,学习这些知识本身就不是一件轻松的事情,更何况要开发出优秀的应用程序来。在Windows平台上使用过这些技术的程序员一定深有体会。
1(b)则要简明得多,这是一个尚未实现的结构模型,但是Microsoft正在朝这个方向努力。在表现层,我们现在开发应用程序,要么使用Win32 API开发客户应用,要么利用HTMLDHTML直接把浏览器用作客户应用。在DNA结构中,FORMS+还只是一个技术框架,它将把Win32 GUIWeb API结合起来,并朝着DHTML的方向发展,我们可以从已经发布的Microsoft Internet Explorer 5的结构模型中看到FORMS+的一些端倪。在数据层,STORAGE+还只是一种提法,不过Microsft已经把数据库接口从ODBC转移到ADOOLE DB上,这将最终促进数据层接口技术的统一。
在中间业务层,COM+已经成为现实,它以系统服务的形式把原先散落的众多技术综合起来,并提供简单的编程模型,以直接应用层的编程接口为应用程序提供服务。COM+DNA结构的核心,它将成为企业应用或者分布式应用的基本工具。伴随着Windows 2000的面世,DNA结构也将逐渐清晰,最终带给我们一个全新的应用软件模型。
COM+的基本结构并不复杂,简单说起来,它把COMMTS的编程模型结合起来,同时又增加了一些新的特性
COM的发展角度来看,COM最初作为桌面操作系统平台上的组件技术,主要为OLE服务。但是随着Windows NTDCOM的发布,COM通过底层的远程支持使组件技术延伸到了分布式应用领域,充分体现了COM的扩展能力以及组件结构模型的优势。MTSCOM增添了许多新的内容,弥补了COMDCOM的一些不足,它注重于服务器一端的组件管理和配置环境。COM+进一步把COMDCOMMTS统一起来,形成真正适合于企业应用的组件技术。COMDCOMMTS以及COM+的结构关系如图2所示。
2 COM+组成结构图
COM+不仅继承了COMDCOMMTS的许多特性,同时也新增了一些服务,比如负载平衡、内存数据库、事件模型、队列服务等。COM+新增的服务为COM+应用提供了很强的功能,建立在COM+基础上的应用程序可以直接利用这些服务而获得良好的企业应用特性,本文第二部分将重点介绍这些服务。
COM+还提供了一个比MTS更好的组件管理环境,如图3所示。COM+管理程序(COM+ Explorer)也采用了MMC(Microsoft Management Console)标准界面。对应于MTS中的包(Package)COM+称之为COM+应用(COM+ Application),每一个COM+应用也包括一个或多个COM+组件以及与应用有关的角色信息。通过COM+管理程序,我们可以设置COM+应用和COM+组件的属性信息,比如组件的事务特性、安全特性等等。如图4所示。
3 COM+管理程序运行示意图
4 COM+组件的属性配置示意图
我们知道,COMMTS把组件的所有配置信息都保存在Windows的系统注册表中,然而,COM+的做法有所不同,它把大多数的组件信息保存在一个新的数据库中,称为COM+目录(COM+ Catalog)COM+目录把COMMTS的注册模型统一起来,并提供了一个专门针对组件的管理环境。我们既可以通过COM+管理程序检查或设置COM+目录信息,也可以在程序中通过COM+提供的一组COM接口访问COM+目录信息。
COM+一方面提供了许多新的服务和一个一致的管理环境,另一方面它支持说明性编程模型(declarative programming model),也就是说,开发人员可以按尽可能通用的方式开发组件程序,把一些细节留到配置时刻再确定。举例来说,我们开发一个COM+组件,它支持负载平衡特性,但是我们在开发组件的时候,并不确定它是否使用负载平衡特性,而把是否支持负载平衡特性留待配置时刻再作决定。有的应用可能会需要负载平衡特性,而有的应用可能并不需要,我们可以通过COM+管理程序配置组件的属性来决定组件是否支持负载平衡特性。MTS安全模型实际上是一个典型的说明性编程技术,它把组件的安全角色信息留到配置时刻再给出确切的定义,而非编程时刻。COM+继承了MTS的安全模型。
利用COM+的服务和管理工具,以及随后发布的一些开发工具,开发一个COM+组件要比开发一个COM组件容易得多,因为COM+组件实际上是建立在COM+系统服务基础上的应用程序,我们可以避免底层繁琐的细节处理。通过COM+系统服务,我们在获得可靠性的同时,也使我们的组件或者应用程序更趋于标准化,在更广泛的范围内体现组件或者应用的多态性。
COM+组件的可管理性和可配置性是如何获得的呢?如同MTS组件一样,COM+为每一个对象提供了一个对象环境(Object Context)COM+系统可以在创建COM+对象的时候为其分配一个环境对象,这种技术也被称为截取(intercept),下面的步骤可以进一步说明截取的概念:
(1)    组件对象通过说明性属性(declarative attributes)指定它的一些基本要求;
(2)    当客户程序调用CoCreateInstance函数时,COM+系统检查客户代码是否运行在与对象类兼容的对象环境中;
(3)如果客户代码的运行环境与对象类所要求的兼容,那么不必使用截取技术,直接创建对象并返回对象的接口引用;
(4)    如果不兼容,那么CoCreateInstance函数切换到一个与对象类兼容的环境中,然后创建对象并返回一个代理对象;
(5)在以后的接口方法调用过程中,代理对象在调用前和调用后都要做一些处理以便方法的运行环境能够满足对象的要求。
COM+引入了环境(context)的概念,它是指共享同一套运行要求的对象集合。由于不同的对象类可能使用了不同的配置信息,所以一个进程通常包含一个或多个环境,这些环境的配置互不兼容。所有无配置信息的对象都驻留在调用方的环境中。每一个环境都有一个对象,即对象环境,运行在此环境中的对象可通过CoGetObjectContext API函数得到此对象环境,利用对象环境的IObjectContextInfo接口可以访问到环境的属性信息。
COM+的对象引用即客户拥有的对象接口指针与环境相关,所以我们不能简单地把对象引用从一个环境传递到另一个环境。当客户从一个环境调用到另一个环境中的对象时,中间必须经过代理对象和存根代码,由代理对象截取调用,负责进行环境切换,这个过程类似于COM的跨进程列集(marshaling)处理。如图5所示。
5 跨环境调用示意图
从图5我们可以看出,环境与COM线程模型中的套间(apartment)非常类似,当对象引用(即对象接口指针)从一个环境传递到另一个环境时,它也要经过列集(marshaling)处理,即调用CoMarshalInterfaceCoUnmarshalInterface函数。这样才能保证客户代码和对象分别在自己的环境中执行,对于支持事务特性、安全特性或其他特殊要求的应用,这是很重要的。
虽然跨环境的调用必须经过代理和存根代码,但是这并不意味着需要经过线程切换,这是环境与套间的重要区别。在跨套间调用过程中,影响性能的主要因素在于线程切换,而不是参数列集(marshaling)和散集(unmarshaling)处理,因此跨环境调用比跨套间调用的效率可能要高得多。COM+引入了环境概念,但套间的概念仍然存在,两者的区别在于,套间是线程模型的基本单元,而环境则是列集机制的基本边界。环境和套间没有包含关系,一个环境中的对象可以运行在不同的套间,此时跨套间调用也必须经过代理对象;一个套间中的对象也可以包含多个环境对象,此时跨环境调用也必须经过代理对象。
从以上对COM+的介绍我们可以看出,COM+的底层结构仍然以COM为基础,但在应用方式上则更多地继承了MTS的处理机制,包括MTS的对象环境、安全模型、配置管理等。但COM+并不是对COMMTS进行简单的封装,它也引入了许多新的内容,正是这些新特征使得COM+更加适合于企业应用的组件对象模型,这些新特征通过一组系统服务来体现,下一部分介绍这些系统服务。
COM+的系统服务充分体现了COM+的特征,通过这些系统服务,我们可以很容易地开发出多层结构的应用系统,因为这些系统服务本身已经满足了多层应用的一些基本要求。COM+以系统服务的形式为应用提供了许多新特性,这有多方面的好处,首先,客户或者组件程序可以直接利用这些系统服务,避免了底层的细节处理,减少开发成本,降低代码量,同时也减小了犯错误的可能性;其次,有一些系统服务涉及到较复杂的逻辑,可能要访问底层的系统资源,应用层很难实现这些系统服务;另外,使用系统服务可增强可靠性,因为这些系统服务已经经过严格的测试,应用系统要获得同样的可靠性需要很昂贵的代价。
COM+的系统服务有的从MTS继承过来,有的是新增加的。这一部分重点对新增的一些系统服务作初步的介绍,包括队列组件、负载平衡、内存数据库和事件服务,最后介绍其他一些在MTS中已经引入的、但COM+又增强了的系统服务,包括事务、对象池、安全模型以及管理特性。
我们知道,COM客户与远程组件之间的交互是基于RPC连接的,客户连接到一个组件对象,请求指定的接口,然后通过接口指针执行同步调用。虽然COM也允许异步调用,但客户与组件的生存期必须保持一致,调用必须在连接有效期范围内进行。
COM+除了支持这种基于RPC连接的运行方式,它还支持另一种运行模式,我们称为基于消息的通讯过程,它可以有效地把客户与组件的生存期分离开。这种模式通过COM+的队列组件服务实现,图6是队列组件的基本模型结构。
6 队列组件模型结构
队列组件并没有使用直接的RPC连接,而是采用了底层的消息系统MSMQ(Microsft Message Queue Server)。通过底层的队列机制,客户与组件的生存周期可以被分离在不同的时间点上。客户程序不再直接调用组件对象,它利用消息机制与组件对象进行通讯,即使组件对象并没有运行,客户程序仍然可以执行操作。
COM+应用可以以透明方式支持同步和异步两种调用方式,当客户和组件程序建立了连接之后,客户以同步方式直接调用组件的方法;如果客户与组件没有建立直接的连接,那么客户以异步方式与组件进行通讯。如果组件对象被标识为“队列化”,那么它支持队列方式运行,于是一个被称为“COM+记录器”的代理对象自动把所有该组件的调用请

抱歉!评论已关闭.