China. coM 第15章COM+应用程序 当我们伴随着 Windows2000和ASP30进入21世纪时,发现微软在企业应用程序开发方面 扩展和改进了对开发人员来说非常有用的工具和技术。在前面两章中讨论了如何使用ASP和 COM构建web应用程序。通过使用功能强大的IS,使用所选择的程序语言开发COM组件,使 eb应用程序远远超越仅使用ASP脚本创建互相链接的简单网页的水平。可以开发安全高效的 基于组件的可扩展应用程序,以此来支持面向数以千计用户的业务处理 Windows2000中显著的变化是微软的事务服务器( Microsoft transaction Server,MTS)得 以改善并融入COM运行期中,当然,除此以外还有许多其他新的特性和改进。每一项改进都 可以使我们的应用程序比以前更为强大和可扩展 使用COM+可从组件开发COM+应用程序,以提供基础服务和代码,而不是从头进行开发。 当开发基于DNA的多层应用程序时,这些服务给我们提供了起点。这些应用程序能发挥 COM+所提供的服务与基础结构的优势,这些都是企业级应用程序所需要的,如事务处理 组件管理、安全和对象缓冲等。每一项服务对于完成任务都是举足轻重的,如果自己开发需 要投入很大的精力。还好现在都由 Windows2000提供。我们所要做的只是使用 Component Services Explorer来定义如何使用而已 组件服务是微软对COM、COM+以及像微软消息队列( Microsoft Message Queue,MSMQ) 这样的相关技术的概括性名称。 本章内容包括 COM+如何为开发稳固且可扩展的基于组件的应用程序提供构件 如何创建和管理应用程序。 如何用 Visual basic创建用于COM+环境的组件 线程和组件作用域如何影响网站的可扩展性。 如何调试COM+组件。 下面先从COM+概述开始,了解COM+作为 Windows2000完整的一个组成部分,对于基 组件的应用程序开发人员多么有用,并进一步研究COM+构造的基本原理。 15.1微软组件服务(COM+) 第13章介绍了微软组件服务( Microsoft Component Services,MCS)和COM+作为配置 Windows dna的工具,研究了COM+作为一个“对象管理者”的功能。作为一个对象管理者 COM+在整个生存期负责管理COM+对象,这就意味着COM+实际上创建了对象,管理应用程 序对组件的使用,然后当其不再使用时就取消这些对象 使用像COM+这样的“对象管理员”来管理对象的生存期,而不是让每个应用程序去单 独管理,通过仔细监视和操纵应用程序和COM+对象之间的基本交互,能够更加有效地使用 系统资源,为了完成这个目的,COM+需要以某种方式与应用程序/对象相关联
下载 第15章 COM+应用程序 当我们伴随着Windows 2000和ASP 3.0进入2 1世纪时,发现微软在企业应用程序开发方面 扩展和改进了对开发人员来说非常有用的工具和技术。在前面两章中讨论了如何使用 A S P和 C O M构建We b应用程序。通过使用功能强大的 I I S,使用所选择的程序语言开发 C O M组件,使 We b应用程序远远超越仅使用 A S P脚本创建互相链接的简单网页的水平。可以开发安全高效的 基于组件的可扩展应用程序,以此来支持面向数以千计用户的业务处理。 Windows 2000中显著的变化是微软的事务服务器 (Microsoft Transaction Server,M T S )得 以改善并融入C O M运行期中,当然,除此以外还有许多其他新的特性和改进。每一项改进都 可以使我们的应用程序比以前更为强大和可扩展。 使用C O M +可从组件开发C O M +应用程序,以提供基础服务和代码,而不是从头进行开发。 当开发基于 D N A的多层应用程序时,这些服务给我们提供了起点。这些应用程序能发挥 C O M +所提供的服务与基础结构的优势,这些都是企业级应用程序所需要的,如事务处理、 组件管理、安全和对象缓冲等。每一项服务对于完成任务都是举足轻重的,如果自己开发需 要投入很大的精力。还好现在都由 Windows 2000提供。我们所要做的只是使用 C o m p o n e n t Services Explorer来定义如何使用而已。 组件服务是微软对C O M、C O M +以及像微软消息队列(Microsoft Message Queue,M S M Q ) 这样的相关技术的概括性名称。 本章内容包括: • COM+如何为开发稳固且可扩展的基于组件的应用程序提供构件。 • 如何创建和管理应用程序。 • 如何用Visual Basic创建用于C O M +环境的组件。 • 线程和组件作用域如何影响网站的可扩展性。 • 如何调试C O M +组件。 下面先从C O M +概述开始,了解 C O M +作为Windows 2000完整的一个组成部分,对于基 于组件的应用程序开发人员多么有用,并进一步研究 C O M +构造的基本原理。 15.1 微软组件服务( C O M + ) 第1 3章介绍了微软组件服务 (Microsoft Component Services,M C S )和C O M +作为配置 Windows DNA的工具,研究了C O M +作为一个“对象管理者”的功能。作为一个对象管理者, C O M +在整个生存期负责管理C O M +对象,这就意味着C O M +实际上创建了对象,管理应用程 序对组件的使用,然后当其不再使用时就取消这些对象。 使用像C O M +这样的“对象管理员”来管理对象的生存期,而不是让每个应用程序去单 独管理,通过仔细监视和操纵应用程序和 C O M +对象之间的基本交互,能够更加有效地使用 系统资源,为了完成这个目的, C O M +需要以某种方式与应用程序 /对象相关联
第15章(COM+用程序459 下载 15.1.1拦截原理 COM+能够在应用程序和COM对象(组件)之间插入代码。在本章你将看到,这种拦截 ( Interception)是如何通过COM实现的,但现在把这个过程想象为一种COM+“粘性”代码, 只要COM对象的方法或属性在应用程序中使用,就调用这段代码,完成一些初始的设置过程, 然后调用真正的对象方法 为了理解拦截所能提供的益处和功能,先考虑一个典型的Web应用程序:有多个用户每 天以较高的频率访问同一个ASP页面,基于组件的Web应用程序中每个ASP页将包含完成下面 个基本步骤的ASP脚本 创建一个或多个COM对象 使用COM对象生成页面。 取消这些COM对象 假如一天之内收到50000个关于该页面的请求,如果该页面创建两个COM对象,那就需 要创建和取消1000个COM对象。考虑到创建和取消COM对象需要的计算机资源的总开销, 相比之下循环使用COM对象效率更高。当ASP完成调用COM对象以后,将其放入一个缓冲池 内,并可从缓冲池中取出,由其他的ASP页面重复使用。我们将看到这会明显提高Web站点的 性能。如果所使用的对象在每次创建使用之前(例如连接一个数据库或载入值),进行合理的初 始化工作,可使web站点的潜在性能进一步提高。使用缓冲,可以仅进行一次初始化工作 依据这种循环的思想,理想的ASP页面中的理想的ASP脚本应该依据下面的基本步骤: ·在建立COM对象前,查看缓冲池内是否存在该对象可供重复使用,如果没有,则创建 个新的对象 ·使用COM对象来生成一个页面。 将COM对象返回缓冲池,以供其他页面使用 这个循环过程听起来是很理想。当然实际上,这不可能在ASP脚本中实现。最简单的原 因是不能直接访问COM运行期( runtime),正如在第14章中讨论过的,活动脚本( Active Scripting)引擎调用运行期。即使能使用COM运行期,ASP脚本本身的限制和活动脚本引擎实 际上也阻止这种缓冲方式。暂且把这些限制放在一边,假如能够完成这种缓冲,可以想象 在实现时下面的这些复杂问题是不得不考虑的: 谁来管理对象的缓冲池? 缓冲池何时创建和取消 ·对象在缓冲池中何时创造和取消? 在什么阶段取消对象? 如何管理多个用户同时访问缓冲池? ASP脚本与缓冲池如何交互?程序员编写脚本时,能够记住在创建一个新对象之前必须 检查缓冲池,用完对象之后将一个COM对象返回到缓冲池吗? 显然在ASP脚本中实现这种功能是不可能的,即使能实现这种功能,在实现过程中,也 存在着两个非常重要的障碍需要解决 ·必须自己实现对象缓冲池的代码,要充分考虑到代码、测试、调试和维护周期 使用缓冲池的ASP页面代码必须要正确使用对象缓冲池,而让程序员考虑得太多是一种 错误的倾向。程序员可能经常忘记使用缓冲池
15.1.1 拦截原理 C O M +能够在应用程序和 C O M对象(组件)之间插入代码。在本章你将看到,这种拦截 ( i n t e r c e p t i o n )是如何通过C O M +实现的,但现在把这个过程想象为一种 C O M +“粘性”代码, 只要C O M对象的方法或属性在应用程序中使用,就调用这段代码,完成一些初始的设置过程, 然后调用真正的对象方法。 为了理解拦截所能提供的益处和功能,先考虑一个典型的 We b应用程序:有多个用户每 天以较高的频率访问同一个 A S P页面,基于组件的We b应用程序中每个A S P页将包含完成下面 三个基本步骤的A S P脚本。 • 创建一个或多个C O M对象。 • 使用C O M对象生成页面。 • 取消这些C O M对象。 假如一天之内收到 5 0 0 0 0个关于该页面的请求,如果该页面创建两个 C O M对象,那就需 要创建和取消1 0 0 0 0 0个C O M对象。考虑到创建和取消 C O M对象需要的计算机资源的总开销, 相比之下循环使用 C O M对象效率更高。当A S P完成调用C O M对象以后,将其放入一个缓冲池 内,并可从缓冲池中取出,由其他的 A S P页面重复使用。我们将看到这会明显提高 We b站点的 性能。如果所使用的对象在每次创建使用之前 (例如连接一个数据库或载入值 ),进行合理的初 始化工作,可使 We b站点的潜在性能进一步提高。使用缓冲,可以仅进行一次初始化工作。 依据这种循环的思想,理想的 A S P页面中的理想的A S P脚本应该依据下面的基本步骤: • 在建立C O M对象前,查看缓冲池内是否存在该对象可供重复使用,如果没有,则创建 一个新的对象。 • 使用C O M对象来生成一个页面。 • 将C O M对象返回缓冲池,以供其他页面使用。 这个循环过程听起来是很理想。当然实际上,这不可能在 A S P脚本中实现。最简单的原 因是不能直接访问 C O M运行期 ( r u n t i m e ),正如在第 1 4章中讨论过的,活动脚本 ( A c t i v e S c r i p t i n g )引擎调用运行期。即使能使用 C O M运行期,A S P脚本本身的限制和活动脚本引擎实 际上也阻止这种缓冲方式。暂且把这些限制放在一边,假如能够完成这种缓冲,可以想象, 在实现时下面的这些复杂问题是不得不考虑的: • 谁来管理对象的缓冲池? • 缓冲池何时创建和取消? • 对象在缓冲池中何时创造和取消? • 在什么阶段取消对象? • 如何管理多个用户同时访问缓冲池? • A S P脚本与缓冲池如何交互?程序员编写脚本时,能够记住在创建一个新对象之前必须 检查缓冲池,用完对象之后将一个 C O M对象返回到缓冲池吗? 显然在A S P脚本中实现这种功能是不可能的,即使能实现这种功能,在实现过程中,也 存在着两个非常重要的障碍需要解决: • 必须自己实现对象缓冲池的代码,要充分考虑到代码、测试、调试和维护周期。 • 使用缓冲池的A S P页面代码必须要正确使用对象缓冲池,而让程序员考虑得太多是一种 错误的倾向。程序员可能经常忘记使用缓冲池。 第1 5章 C O M +应用程序计计459 下载
460A5p3高程 Chinaopub.com 下载 COM+减轻了这些负担,提供了一个一般性的基础结构来支持许多不同类型的预写服务, 使组件可透明使用。不用更改一条代码就可使用它们中的一部分 1.COM+的补救措施 COM+是通过下面的机制来弥补这两点的不足 (1)COM+提供服务 首先,COM+提供一系列的服务,例如对象缓冲池,可在COM+应用程序中使用,不用编 写任何代码就可实现这些服务,这意味着不需要调试和检测,也不用担心前面讨论的任何其 他问题。简单地配置组件,通过 Component Services Explorer就可使用请求的服务。我们把那 些使用COM+服务的组件称为“配置的组件”,通过 Component Services Explorer构建的COM+ 应用程序就是使用这种类型的组件。 (2)COM+提供了组件服务之间的透明交互 第二,COM+提供一个基础结构,这意味可以在不改变任何代码的情况下自动地利用这 些服务的优点,因此ASP脚本和其他语言(如VB),能够屏蔽COM+运行期,可以在代码没有 重大改变的情况下使用这些服务。ASP脚本或组件使用这些服务不需要重新编译或修改,在 COM+运行期中也不需要调用低层次的C/C++API函数。不像COM,大多数COM+都是通过 COM接口使用的。 些COM+服务对编程增加了一些规则,需要稍稍修改代码,才能使组件充分使用它们。 正如讨论过的,一些服务(如对象缓冲池)当前在一些编程语言中是不可用的,这主要是由于这 些语言与COM+服务的额外要求之间存在着内在的不兼容性问题,然而,目前微软正在改进 这些服务使之能够用于其他的语言。 本章讨论的是COM+1.0。COM+20许诺增加更多的服务。 2.对象缓冲池 COM会管理所有的代码,根据请求实现一个服务(如缓冲池)。这意味着代码仅需如通常 一样创建和释放一个COM对象;在后台,COM+将使用拦截来实现缓冲池。COM+确保在创 建一个新的对象之前检测缓冲池,试图使用缓冲池中存在的对象:不再使用时,把对象放到 缓冲池中,实现缓冲池的代码不必插入应用程序中,因为在组件中插入服务是透明完成的 VB没有缓冲池 COM+提供了一个强大的通用框架,可提高Web应用程序性能,而不必改变任何代码。通 过 Component Services Explorer来选择组件所使用的服务,不需要重新编译这些组件。若管理 员要增加组件安全性,只让特定的用户能够调用特定的方法,仅需使用组件服务,不需改变 代码。不必担心所有可能使用此组件的应用程序的安全要求。我们把话题转回到COM+。 在幕后,COM+运行期确保已经为组件配置好的服务通过拦截被加入及使用。 我们已经指出在COM+中“拦截”这个词是非常重要的。 不好的方面是,不是所有的服务能被那些用VB编写的组件所使用。大部分能,但缓冲池 是一种不能使用的服务。原因将在后面讲述,但假如想使用特殊的服务,必须用C++编写自 己的组件(在17章中讨论)。已经有大量的服务可供选择,如事务支持和安全性。但为了充分利 用这些服务,应该理解我们所讨论的相关内容,如无状态组件。我们将在第19章中研究 COM+在事务管理中充当的角色
C O M +减轻了这些负担,提供了一个一般性的基础结构来支持许多不同类型的预写服务, 使组件可透明使用。不用更改一条代码就可使用它们中的一部分。 1. COM+的补救措施 C O M +是通过下面的机制来弥补这两点的不足。 (1) COM+提供服务 首先,C O M +提供一系列的服务,例如对象缓冲池,可在 C O M +应用程序中使用,不用编 写任何代码就可实现这些服务,这意味着不需要调试和检测,也不用担心前面讨论的任何其 他问题。简单地配置组件,通过 Component Services Explorer就可使用请求的服务。我们把那 些使用C O M +服务的组件称为“配置的组件”,通过Component Services Explorer构建的C O M + 应用程序就是使用这种类型的组件。 (2) COM+提供了组件/服务之间的透明交互 第二,C O M +提供一个基础结构,这意味可以在不改变任何代码的情况下自动地利用这 些服务的优点,因此 A S P脚本和其他语言 (如V B ),能够屏蔽C O M +运行期,可以在代码没有 重大改变的情况下使用这些服务。 A S P脚本或组件使用这些服务不需要重新编译或修改,在 C O M +运行期中也不需要调用低层次的 C/C++ API函数。不像C O M,大多数C O M +都是通过 C O M接口使用的。 一些C O M +服务对编程增加了一些规则,需要稍稍修改代码,才能使组件充分使用它们。 正如讨论过的,一些服务 (如对象缓冲池)当前在一些编程语言中是不可用的,这主要是由于这 些语言与C O M +服务的额外要求之间存在着内在的不兼容性问题,然而,目前微软正在改进 这些服务使之能够用于其他的语言。 本章讨论的是COM+ 1.0。COM+ 2.0许诺增加更多的服务。 2. 对象缓冲池 C O M +会管理所有的代码,根据请求实现一个服务 (如缓冲池)。这意味着代码仅需如通常 一样创建和释放一个 C O M对象;在后台, C O M +将使用拦截来实现缓冲池。 C O M +确保在创 建一个新的对象之前检测缓冲池,试图使用缓冲池中存在的对象;不再使用时,把对象放到 缓冲池中,实现缓冲池的代码不必插入应用程序中,因为在组件中插入服务是透明完成的。 V B没有缓冲池 C O M +提供了一个强大的通用框架,可提高 We b应用程序性能,而不必改变任何代码。通 过Component Services Explorer来选择组件所使用的服务,不需要重新编译这些组件。若管理 员要增加组件安全性,只让特定的用户能够调用特定的方法,仅需使用组件服务,不需改变 代码。不必担心所有可能使用此组件的应用程序的安全要求。我们把话题转回到 C O M +。 在幕后,C O M +运行期确保已经为组件配置好的服务通过拦截被加入及使用。 我们已经指出在C O M +中“拦截”这个词是非常重要的。 不好的方面是,不是所有的服务能被那些用 V B编写的组件所使用。大部分能,但缓冲池 是一种不能使用的服务。原因将在后面讲述,但假如想使用特殊的服务,必须用 C + +编写自 己的组件(在1 7章中讨论)。已经有大量的服务可供选择,如事务支持和安全性。但为了充分利 用这些服务,应该理解我们所讨论的相关内容,如无状态组件。我们将在第 1 9章中研究 C O M +在事务管理中充当的角色。 460计计ASP 3 高级编程 下载
第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 用户、代理和组件的关系 客户 代理 对象
462A5p3高装程 China pub. coM 下载 2.环境 COM+通过环境跟踪运行期的请求以及对象需要的服务 一个环境( context)是一系列运行期的属性,代表了一个或多个COM+对象的执 行请求。 例如,环境将告诉COM+,一个对象正在使用缓冲池或请求一个新的事务,这些请求是由声 明性属性( declarative attribute)来定义的,声明性属性是使用 Component Services Explorer设置给组 件的,存放在COM+类别中。这些设置直接影响包含在环境中的属性,并给COM+运行期提供正 确实现运行期对象(集)的服务的信息。稍后将你看到,能够在对象中访问这些属性中的一部分 每一个COM对象当其创建或从缓冲池取出时,都与单个的环境相关联。与对象关联的环 境一旦激活,将在对象的整个生存期中保持不变,直到对象返回到缓冲池或被取消。由 COM+使用的环境在对象生存期是有效的,使对象与边界外(out-of- bound)信息相关联。 术语“边界外”( out of band)意思是数据由COM+在幕后管理。 这些数据需要将服务应用于组件,没有环境则必须自己来保持这些信息 如果一些对象的运行期请求是“兼容”的,它们可共享同一个环境。这里使用了兼容 词,是因为在运行期共享一个环境的组件类型的配置不需要统一。COM+用于测试环境兼容 性的算法目前没有记录在文挡中。在一个对象内部,可以获得一个环境的引用,可使用 Getobject Context方法来得到与当前对象关联的环境。这将返回一个COM对象,称为 ObjectContext。在这个对象上通过函数返回的接口是 oBject Context Set objContext Getobjectcontext() (1)激活 对象进入可供客户使用的状态的过程我们称 对象 之为“激活”,创建对象的客户称为“激活者 ( activator),并且激活过程在ASP代码调用 Createobject时发生。在激活期间,环境与一个 对象相关联。 (2)对象与环境 图15-3对象、对象环境以及环境之间的关系 对象、对象环境以及环境之间的关系如图15-3所示,一旦对象激活,这个关系将保持不变 ObjectContext是一个COM对象,提供对运行期属性的访问。这些属性保存在与对象相关 联的环境中。 (3)环境协商 当一个COM+对象创建时,COM 类别用来确定组件所用的服务。假如现 有的环境匹配新创建的对象的环境,将 对象}→·对象环境←·对象 使用现有的环境,否则将创建一个新的 环境,如图15-4所示 如果组件请求的服务意味着激活者 的环境与所需要的不兼容,则一个不同 的环境(和 Object Context)将用于该对 图15-4对象环境匹配
2. 环境 C O M +通过环境跟踪运行期的请求以及对象需要的服务。 一个环境( c o n t e x t )是一系列运行期的属性,代表了一个或多个 C O M +对象的执 行请求。 例如,环境将告诉C O M +,一个对象正在使用缓冲池或请求一个新的事务,这些请求是由声 明性属性(declarative attribute)来定义的,声明性属性是使用Component Services Explorer设置给组 件的,存放在C O M +类别中。这些设置直接影响包含在环境中的属性,并给C O M +运行期提供正 确实现运行期对象(集)的服务的信息。稍后将你看到,能够在对象中访问这些属性中的一部分。 每一个C O M对象当其创建或从缓冲池取出时,都与单个的环境相关联。与对象关联的环 境一旦激活,将在对象的整个生存期中保持不变,直到对象返回到缓冲池或被取消。由 C O M +使用的环境在对象生存期是有效的,使对象与边界外 ( o u t - o f - b o u n d )信息相关联。 术语“边界外”(out of band)意思是数据由C O M +在幕后管理。 这些数据需要将服务应用于组件,没有环境则必须自己来保持这些信息。 如果一些对象的运行期请求是“兼容”的,它们可共享同一个环境。这里使用了兼容一 词,是因为在运行期共享一个环境的组件类型的配置不需要统一。 C O M +用于测试环境兼容 性的算法目前没有记录在文挡中。在一个对象内部,可以获得一个环境的引用,可使用 G e t O b j e c t C o n t e x t方法来得到与当前对象关联的环境。这将返回一个 C O M对象,称为 O b j e c t C o n t e x t。在这个对象上通过函数返回的接口是 I O b j e c t C o n t e x t。 (1) 激活 对象进入可供客户使用的状态的过程我们称 之为“激活”,创建对象的客户称为“激活者” ( a c t i v a t o r ) ,并且激活过程在 A S P代码调用 C r e a t e O b j e c t时发生。在激活期间,环境与一个 对象相关联。 (2) 对象与环境 对象、对象环境以及环境之间的关系如图1 5 - 3所示,一旦对象激活,这个关系将保持不变。 O b j e c t C o n t e x t是一个C O M对象,提供对运行期属性的访问。这些属性保存在与对象相关 联的环境中。 (3) 环境协商 当一个C O M +对象创建时, C O M + 类别用来确定组件所用的服务。假如现 有的环境匹配新创建的对象的环境,将 使用现有的环境,否则将创建一个新的 环境,如图1 5 - 4所示。 如果组件请求的服务意味着激活者 的环境与所需要的不兼容,则一个不同 的环境 (和O b j e c t C o n t e x t )将用于该对 462计计ASP 3 高级编程 下载 图15-3 对象、对象环境以及环境之间的关系 环 境 对象 对象环境 图15-4 对象环境匹配 对象 对象环境 对象 环 境