正在加载图片...
第5章(OM+用程序461 下载 因此,让我们先研究COM+是怎样工作的 151.2cOM+结构 第14章讨论了COM的两个组成部分,组件和接口。我们认为组件是个黑盒子,通过一个 或更多的接口为客户提供功能,客户不必了解组件功能是如何 编写的,但它们在使用组件所提供的功能时,需要知道所依赖 的接口是一种协议。在两者之间最基本的交互如图15-1所示 客户使用组件的接口来完成一些任务 图15-1用户与组件的关系 图15-1中没有显示任何接口名,这是一个适用于任何客户/对象对的通用框图。 1.拦截 COM+为了能将服务透明地加到一个对象上,将自己放入客户与组件实例之间,例如为 了实现缓冲池,COM+服务必须拦截对 IUnknown的 Release方法的调用。如在14章中讨论的, 每一个COM对象保存一个引用计数,以便每个对象能够跟踪有多少个客户正在使用它。当引 用计数为零时,对象负责取消自己。很明显当我们想让别的客户重复使用此对象时,由对象 本身完成这个工作是不合适的,因此COM+需要管理这个基本的生存期循环。在理论上,需 要的改变是比较简单的 ·当对象创建时,COM+对象的缓冲池服务额外增加对组件的引用计数,表示进行缓冲。 监视对被缓冲对象的 Release方法的调用,当检测到对象只有一个外部引用时,可将它放 回缓冲池中,因为其他用户不再使用该对象,因此它属于这个引用。 际上,对一个特定的组件来说实现这些 变换是比较复杂的,但COM+使之简单化。为 成拦截请求来实现服务,COM+使用了轻量 代理( (lightweight proxy),如图15-2所示 图15-2用户、代理和组件的关系 之所以称之为轻量代理(也称为拦截器),是因为其包含了正好足够的代码,确保粘性代码 能够放在客户与真实对象之间,确保所有配置的组件需要使用的服务在运行期内正常使用 当客户调用一种方法时,粘性代码确保方法在实际执行时,运行期环境是在合适的状 态:当方法完成后,恢复原来环境。例如,考虑下面这种情况,一个对象客户在一个事务里 但是所调用的组件的配置是请求一个新事务。拦截的粘性代码将确保把当前的事务放在一边 创建一个新的事务,然后调用方法。在调用的方法中完成的工作与新的事务相联系,而不是 与实际调用组件的客户的事务相联系。当方法返回时,将恢复原有的事务,新创建的事务结 这就是拦截工作方式的最简单描述。可以想象一下,COM+运行期代表组件执行一个或 多个前后的设置步骤,就会明白COM+运行期正在做些什么,以及为什么轻量代理是如此重 要。它们完成那些难以编写的代码,这些代码完成了基本结构检测工作,使我们从编写这些 代码的工作中解脱出来 拦截听起来像一个多余的过程,因为客户调用对象的每一种方法都通过一个额外的间接 过程(粘性代码),但却能保证COM+运行期以一种非常有效的方式执行操作,如果客户与它创 建的对象使用相同的服务,经常会发现轻量代理不是必需的。因此也不会有额外的开销。 使使用的服务不同,增加的代码也是正好足以处理这些不同之处因此,让我们先研究C O M +是怎样工作的。 15.1.2 COM+结构 第1 4章讨论了C O M的两个组成部分,组件和接口。我们认为组件是个黑盒子,通过一个 或更多的接口为客户提供功能,客户不必了解组件功能是如何 编写的,但它们在使用组件所提供的功能时,需要知道所依赖 的接口是一种协议。在两者之间最基本的交互如图 1 5 - 1所示。 客户使用组件的接口来完成一些任务。 图1 5 - 1中没有显示任何接口名,这是一个适用于任何客户 /对象对的通用框图。 1. 拦截 C O M +为了能将服务透明地加到一个对象上,将自己放入客户与组件实例之间,例如为 了实现缓冲池, C O M +服务必须拦截对 I U n k n o w n的R e l e a s e方法的调用。如在 1 4章中讨论的, 每一个C O M对象保存一个引用计数,以便每个对象能够跟踪有多少个客户正在使用它。当引 用计数为零时,对象负责取消自己。很明显当我们想让别的客户重复使用此对象时,由对象 本身完成这个工作是不合适的,因此 C O M +需要管理这个基本的生存期循环。在理论上,需 要的改变是比较简单的。 • 当对象创建时,C O M +对象的缓冲池服务额外增加对组件的引用计数,表示进行缓冲。 • 监视对被缓冲对象的R e l e a s e方法的调用,当检测到对象只有一个外部引用时,可将它放 回缓冲池中,因为其他用户不再使用该对象,因此它属于这个引用。 实际上,对一个特定的组件来说实现这些 变换是比较复杂的,但 C O M +使之简单化。为 完成拦截请求来实现服务, C O M +使用了轻量 代理(lightweight proxy),如图1 5 - 2所示。 之所以称之为轻量代理(也称为拦截器),是因为其包含了正好足够的代码,确保粘性代码 能够放在客户与真实对象之间,确保所有配置的组件需要使用的服务在运行期内正常使用。 当客户调用一种方法时,粘性代码确保方法在实际执行时,运行期环境是在合适的状 态;当方法完成后,恢复原来环境。例如,考虑下面这种情况,一个对象客户在一个事务里, 但是所调用的组件的配置是请求一个新事务。拦截的粘性代码将确保把当前的事务放在一边, 创建一个新的事务,然后调用方法。在调用的方法中完成的工作与新的事务相联系,而不是 与实际调用组件的客户的事务相联系。当方法返回时,将恢复原有的事务,新创建的事务结 束。 这就是拦截工作方式的最简单描述。可以想象一下, C O M +运行期代表组件执行一个或 多个前后的设置步骤,就会明白 C O M +运行期正在做些什么,以及为什么轻量代理是如此重 要。它们完成那些难以编写的代码,这些代码完成了基本结构检测工作,使我们从编写这些 代码的工作中解脱出来。 拦截听起来像一个多余的过程,因为客户调用对象的每一种方法都通过一个额外的间接 过程(粘性代码),但却能保证C O M +运行期以一种非常有效的方式执行操作,如果客户与它创 建的对象使用相同的服务,经常会发现轻量代理不是必需的。因此也不会有额外的开销。即 使使用的服务不同,增加的代码也是正好足以处理这些不同之处。 第1 5章 C O M +应用程序计计461 下载 客户 对象 图15-1 用户与组件的关系 图15-2 用户、代理和组件的关系 客户 代理 对象
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有