Controllo della durata e dello stato degli oggetti
Un oggetto in pool può partecipare al modo in cui COM+ gestisce l'attività nel pool implementando IObjectControl. Quando viene creato un oggetto in pool, viene aggregato in un oggetto più grande che gestirà l'oggetto chiamando i metodi seguenti su IObjectControl in punti regolari nel ciclo di vita dell'oggetto:
- Attiva: viene chiamato ogni volta che l'oggetto viene restituito a un client, attivato in un contesto specifico.
- Disattiva: viene chiamato ogni volta che un oggetto viene rilasciato dal client o, nel caso di un oggetto attivato da JIT, quando viene disattivato.
- CanBePooled: Chiamato ogni volta che un oggetto deve essere restituito al pool generale.
L'implementazione di IObjectControl è facoltativa, ad eccezione degli oggetti transazionali, che deve sempre implementare CanBePooled per monitorare lo stato delle risorse contenute. Tuttavia, è consigliabile implementare IObjectControl nella maggior parte dei casi perché offre un modo efficiente per gestire il comportamento di un oggetto in pool, come descritto di seguito.
Esecuzione dell'inizializzazione specifica del contesto
Utilizzando Activate, è possibile inizializzare l'oggetto nel contesto in cui viene attivato per un determinato client. Ad esempio, per determinare se l'oggetto ha affinità di transazione (le relative risorse potrebbero essere già incluse), è possibile ottenere l'ID transazione associato al contesto.
In genere si usa Activateper eseguire l'inizializzazione coerente in tutti i metodi esposti dall'oggetto, trattandolo come parte specifica del contesto del costruttore dell'oggetto.
Pulizia di qualsiasi stato client
Usando Disattiva, è possibile eliminare qualsiasi stato specifico del client che potrebbe esistere in modo che l'oggetto torni al pool in uno stato completamente generico e quindi può essere usato da qualsiasi client senza compromettere la sicurezza o l'isolamento.
Controllo del riutilizzo dell'oggetto
Usando CanBePooled, è possibile monitorare lo stato interno dell'oggetto e segnalare se è adatto al riutilizzo. Se CanBePooled restituisce True e il valore massimo del pool non è stato raggiunto, l'oggetto viene posizionato di nuovo nel pool generale. Se CanBePooled restituisce False, l'oggetto viene rimosso. Nel caso di componenti transazionali, la restituzione di False comporterà un errore nella transazione corrente.
In genere, si mantiene un membro dati globale per l'oggetto e se si rileva una connessione non valida o una risorsa di qualche tipo in uno stato non valido, impostarla in modo da riflettere la situazione corrente e restituirla tramite CanBePooled.
Se un oggetto non implementa CanBePooled, le istanze continueranno a essere riutilizzate fino al raggiungimento del livello massimo del pool.
Argomenti correlati