Управление временем существования объекта и состоянием
Объект с пулом может участвовать в том, как COM+ управляет его действиями в пуле, реализуя IObjectControl. При создании объекта в пуле он агрегируется в более крупный объект, который будет управлять объектом, вызывая следующие методы в IObjectControl в регулярных точках жизненного цикла объекта:
- Активация— вызывается всякий раз, когда объект возвращается клиенту, активируется в определенном контексте.
- Деактивация— вызывается всякий раз, когда объект освобождается клиентом или в случае объекта, активируемого JIT, при его деактивации.
- CanBePooled — вызывается всякий раз, когда объект должен возвращаться в общий пул.
Реализация IObjectControl является необязательным, за исключением транзакционных объектов, которые всегда должны реализовывать CanBePooled для отслеживания состояния удерживаемых ресурсов. Однако в большинстве случаев рекомендуется реализовать IObjectControl , так как он обеспечивает эффективный способ управления поведением объекта в пуле, как описано ниже.
Выполнение инициализации для конкретного контекста
С помощью активации объект можно инициализировать в контексте, в котором он активируется для данного клиента. Например, чтобы определить, имеет ли объект сходство транзакций (его ресурсы уже могут быть зачислены), можно получить идентификатор транзакции, связанный с контекстом.
Обычно для выполнения инициализации, согласованной между любыми методами, предоставляемыми объектом, используется активация, которая считается частью конструктора объекта в контексте.
Очистка любого состояния клиента
С помощью деактивации можно избавиться от любого состояния клиента, которое может существовать таким образом, чтобы объект возвращался в пул в полностью универсальном состоянии, а затем может использоваться любым клиентом без ущерба для безопасности или изоляции.
Управление повторным использованием объекта
С помощью CanBePooled можно отслеживать внутреннее состояние объекта и сообщать о том, подходит ли он для повторного использования. Если CanBePooled возвращает значение True и максимальный максимум пула не достигнут, объект помещается обратно в общий пул. Если CanBePooled возвращает false, объект не карта. В случае с компонентами транзакций возвращающий значение False приведет к тому, что текущая транзакция будет обречена на текущую транзакцию.
Как правило, некоторые глобальные члены данных для объекта сохраняются, и если вы обнаружите, что подключение плохо или ресурс какого-либо типа находится в плохом состоянии, установите это значение, чтобы отразить текущую ситуацию и вернуть его через CanBePooled.
Если объект не реализует CanBePooled, экземпляры будут повторно использоваться до достижения максимального уровня пула.
См. также