控制对象生存期和状态
共用对象可以通过实现 IObjectControl 参与 COM+ 在池中管理其活动的方式。 创建共用对象时,它将聚合为更大的对象,该对象将通过调用对象生命周期中的常规点对 IObjectControl 进行以下方法来管理对象:
- 激活 - 每当对象返回到客户端时调用,在特定上下文中激活。
- 停用 - 每当客户端释放对象时调用,或者在停用 JIT 激活的对象时调用。
- CanBePooled - 每当对象返回到常规池时调用。
实现 IObjectControl 是可选的,但事务对象除外,这些对象应始终实现 CanBePooled 以监视它们持有的资源的状态。 但是,在大多数情况下,建议实现 IObjectControl ,因为它提供了一种高效的方式来管理共用对象的行为,如下所示。
执行Context-Specific初始化
使用 Activate,可以在为给定客户端激活对象的上下文中初始化该对象。 例如,若要确定对象是否具有事务相关性 (其资源可能已登记) ,可能会获取与上下文关联的事务 ID。
通常,你将使用 Activateto 执行初始化,该初始化在对象公开的任何方法中保持一致,将其视为对象的构造函数的特定于上下文的部分。
清理任何客户端状态
使用 “停用”,可以删除可能存在的任何特定于客户端的状态,以便对象以完全通用状态返回到池,然后可由任何客户端使用,而不会影响安全性或隔离。
控制对象的重用
使用 CanBePooled,可以监视对象的内部状态,并报告它是否适合重复使用它。 如果 CanBePooled 返回 True 且池最大值尚未达到,则对象将重新放置在常规池中。 如果 CanBePooled 返回 False,则放弃该对象。 对于事务组件,返回 False 将注定当前事务。
通常,将保留对象的一些全局数据成员,如果检测到连接不正确或某种资源处于错误状态,请将其设置为反映当前情况,并通过 CanBePooled 返回它。
如果对象未实现 CanBePooled,则实例将继续重复使用,直到达到池最大级别。
相关主题