COM+ 上下文

对于在 COM+ 应用程序中运行的已配置组件,上下文是提供 COM+ 服务的基础。 在 COM+ 中,上下文被定义为与一个或多个 COM 对象相关联的运行时属性集,用于为这些对象提供服务。

在 COM+ 中,每个 COM 对象在运行时(即在激活和停用之间)都与一个上下文相关联,而且每个上下文都位于一个 COM 单元中。 多个对象可在同一个上下文中运行,多个上下文可位于同一单元内。 上下文属性(如安全上下文属性)会在对象被激活时初始化,代表了对象的运行时需求。

注意

对于不使用 COM+ 服务的未配置组件,上下文在大多数情况下都会被忽略。

 

COM+ 使用上下文属性作为提供运行时服务的基础。 这些属性保存的状态决定了执行环境如何为上下文中的对象提供服务。 在某些情况下,可以直接与对象的上下文属性交互,以指明与为对象提供的服务相关的某些状态。 例如,当参与自动事务的对象对事务结果进行投票时,就可以这样做。

有关这些概念的 COM 基础的详细讨论,请参阅进程、线程和单元

与上下文属性进行编程交互

每个上下文都有一个关联的 ObjectContext 对象,用于跟踪其属性。 可以通过调用 GetObjectContext 函数来访问 ObjectContext。 访问 ObjectContext 后,可以调用 IObjectContext 接口上的方法来操作上下文属性。

例如,调用 IObjectContext::SetComplete 的效果是将与对象关联的上下文的事务一致性位设置为“一致”,并将 JIT-activation 完成位设置为“完成”。 向 COM+ 发出“一致”信号,表示投票决定提交事务,“完成”表示对象已准备好在方法返回时停用。

除了 IObjectContext,提供上下文属性访问的其他专门接口还有 IObjectContextInfoIContextStateIObjectContextActivity。 在某种程度上,ISecurityCallContext 也可以访问上下文属性。 可以使用 IGetSecurityCallContext::GetSecurityCallContext 来获取 ISecurityCallContext

了解激活和拦截

一般来说,你只用考虑上下文所代表的大量属性(其中一些属性是可以设置或获取的),它们将用于为组件提供 COM+ 服务。 但在某些情况下,可能需要更详细地考虑以下两个相互关联的上下文:

  • 上下文激活,或在适当的上下文中初始化对象。
  • 拦截,或 COM+ 在跨上下文边界调用时的做法。

与 MTS 上下文包装器的关系

上下文有效取代了 MTS 上下文包装器。 它们的作用是通过捕获创建请求来提供自动服务,现在已成为 COM+ 的一项集成功能。 因此,不再需要使用 SafeRef 函数。 在 MTS 中,SafeRef 用于获取对象的引用,该引用可以在上下文包装器之外传递。 在 COM+中,这是不必要的;普通对象引用(指针)是有效的。