可共用对象的要求
可池对象必须满足某些要求,才能让多个客户端使用单个对象实例。
无状态
为了维护安全性、一致性和隔离性,可池对象不应保留客户端到客户端的特定于客户端的状态。 可以使用 IObjectControl 管理任何每个客户端状态,使用 IObjectControl::Activate 和清除任何使用 IObjectControl::D eactivate 的客户端状态执行特定于上下文的初始化。 有关详细信息,请参阅 控制对象生存期和状态。
无线程相关性
可池对象不能绑定到特定线程;否则,性能可能是灾难性的。 因此,无法将可共用对象标记为在单元模型中运行;它们必须在多线程公寓或中性公寓中运行。 此外,可池对象不应使用线程本地存储,也不应聚合自由线程封送器。 有关 COM+ 中的线程处理的详细信息,请参阅 COM+ 线程模型。
注意
Microsoft Visual Basic 6.0 及更早的开发环境只能创建单元模型组件。 但是,在 Visual Basic .NET 中,可以共用组件。
可聚合
可池对象必须支持聚合,也就是说,必须使用非 NULL pUnkOuter 参数调用 CoCreateInstance 来创建它们。 当 COM+ 激活共用对象时,它会创建一个聚合来管理共用对象的生存期,并在 IObjectControl 上调用方法。 有关编写可聚合对象的详细信息,请参阅 聚合。
事务组件
参与事务的可池对象必须手动登记托管资源。 如果对象包含数据库连接等托管资源,则当对象在给定上下文中激活时,资源管理器将无法自动登记在事务中。 因此,对象本身必须处理检测事务的逻辑,关闭资源管理器的自动登记,并手动登记它持有的任何资源。 此外,事务共用对象应在 IObjectControl::CanBePooled 的参数值中反映其资源的当前状态。 有关更多详细信息,请参阅 共用事务对象。
实现 IObjectControl 以管理对象生存期
可池对象应实现 IObjectControl,尽管不需要这样做。 但是,共用的事务组件必须实现 IObjectControl。 这些组件应监视它们保存的资源的状态,并指示何时无法重复使用这些资源:当 IObjectControl::CanBePooled 返回 false 时,它将注定事务。 有关详细信息,请参阅 控制对象生存期和状态。
语言限制
无法使用 Microsoft Visual Basic 6.0 及更早版本开发的组件进行池化,因为这些组件将被单元模型线程化。 但是,在 Visual Basic .NET 中,可以共用组件。
早期组件
只要它们是非事务性的,并且符合上述适当要求,即使组件未专门编写池功能,也可以进行池化。 不需要实现 IObjectControl;不这样做的组件不会参与管理其生存期。 如果未实现 IObjectControl::CanBePooled ,则对象将继续重复使用,直到池达到最大大小。
相关主题