Contrôle de la durée de vie et de l’état des objets
Un objet mis en pool peut participer à la façon dont COM+ gère son activité dans le pool en implémentant IObjectControl. Lorsqu’un objet regroupé est créé, il est agrégé dans un objet plus volumineux qui gère l’objet en appelant les méthodes suivantes sur IObjectControl à des points réguliers dans le cycle de vie de l’objet :
- Activate: appelée chaque fois que l’objet est retourné à un client, activé dans un contexte spécifique.
- Deactivate: appelée chaque fois qu’un objet est libéré par le client ou, dans le cas d’un objet activé juste-à-temps, lorsqu’il est désactivé.
- CanBePooled: appelée chaque fois qu’un objet doit être retourné au pool général.
L’implémentation de IObjectControl est facultative, à l’exception des objets transactionnels, qui doivent toujours implémenter CanBePooled pour surveiller l’état des ressources qu’ils détiennent. Toutefois, il est recommandé d’implémenter IObjectControl dans la plupart des cas, car il offre un moyen efficace de gérer le comportement d’un objet regroupé, comme décrit ci-dessous.
Exécution d' Context-Specific
À l’aide de l' activation, vous pouvez initialiser l’objet dans le contexte dans lequel il est activé pour un client donné. Par exemple, pour déterminer si l’objet a une affinité de transaction (ses ressources peuvent déjà être inscrites), vous pouvez obtenir l’ID de transaction associé au contexte.
En général, vous utilisez Activatepour effectuer l’initialisation qui est cohérente dans toutes les méthodes exposées par l’objet, en le traitant comme une partie spécifique au contexte du constructeur de l’objet.
Nettoyage de l’état du client
À l’aide de la fonction Deactivate, vous pouvez supprimer tout état spécifique du client qui peut exister afin que votre objet retourne au pool dans un état totalement générique et puisse ensuite être utilisé par n’importe quel client sans compromettre la sécurité ou l’isolation.
Contrôle de la réutilisation de l’objet
À l’aide de CanBePooled, vous pouvez surveiller l’état interne de votre objet et signaler s’il est adapté à sa réutilisation. Si CanBePooled retourne la valeur true et que le nombre maximal de pools n’a pas été atteint, l’objet est remis dans le pool général. Si CanBePooled retourne la valeur false, l’objet est ignoré. Dans le cas des composants transactionnels, retourner false arrête la transaction en cours.
En règle générale, vous conservez un membre de données global pour l’objet et, si vous détectez une connexion comme étant incorrecte ou une ressource d’un type dont l’État est incorrect, définissez cette valeur pour refléter la situation actuelle et la renvoyer via CanBePooled.
Si un objet n’implémente pas CanBePooled, les instances continuent à être réutilisées jusqu’à ce que le niveau maximal du pool soit atteint.