Controlando o tempo de vida e o estado do objeto

Um objeto em pool pode participar de como COM+ gerencia sua atividade no pool implementando IObjectControl. Quando um objeto em pool é criado, ele é agregado em um objeto maior que gerenciará o objeto chamando os seguintes métodos em IObjectControl em pontos regulares no ciclo de vida do objeto:

  • Ativar — Chamado sempre que o objeto é retornado a um cliente, ativado em um contexto específico.
  • Desativar—Chamado sempre que um objeto é liberado pelo cliente ou, no caso de um objeto ativado por JIT, quando ele é desativado.
  • CanBePooled—Chamado sempre que um objeto deve ser retornado ao pool geral.

A implementação de IObjectControl é opcional, exceto para objetos transacionais, que sempre devem implementar CanBePooled para monitorar o estado dos recursos que eles possuem. No entanto, é aconselhável implementar IObjectControl na maioria dos casos, pois ele fornece uma maneira eficiente de gerenciar o comportamento de um objeto em pool, conforme descrito abaixo.

Executando inicialização específica do contexto

Usando Activate, você pode inicializar o objeto no contexto em que ele é ativado para um determinado cliente. Por exemplo, para determinar se o objeto tem afinidade de transação (seus recursos já podem estar alistados), você pode obter a ID da transação associada ao contexto.

Normalmente, você usaria Activatepara executar a inicialização consistente em todos os métodos expostos pelo objeto, tratando-o como a parte específica do contexto do construtor do objeto.

Limpando qualquer estado do cliente

Usando Desativar, você pode se livrar de qualquer estado específico do cliente que possa existir para que seu objeto retorne ao pool em um estado completamente genérico e possa ser usado por qualquer cliente sem comprometer a segurança ou o isolamento.

Controlando a reutilização do objeto

Usando o CanBePooled, você pode monitorar o estado interno do objeto e relatar se ele está apto para sua reutilização. Se CanBePooled retornar True e o máximo do pool não tiver sido atingido, o objeto será colocado de volta no pool geral. Se CanBePooled retornar False, o objeto será descartado. No caso de componentes transacionais, retornar False condenará a transação atual.

Normalmente, você manteria algum membro de dados globais para o objeto e, se detectar que uma conexão está incorreta ou um recurso de algum tipo está em um estado incorreto, defina isso para refletir a situação atual e retorná-la por meio do CanBePooled.

Se um objeto não implementar CanBePooled, as instâncias continuarão a ser reutilizadas até que o nível máximo do pool seja atingido.

COM+ Object Construtor Strings

Como funciona o pool de objetos

Melhorando o desempenho com o pool de objetos

Agrupando objetos transacionais

Requisitos para objetos agrupáveis