Objets extensibles
Le modèle d'objet extensible est utilisé pour étendre des classes d'exécution existantes à l'aide de nouvelles fonctionnalités ou ajouter un nouvel état à un objet. Les extensions, attachées à l'un des objets extensibles, permettent aux comportements à des étapes différentes du traitement, d'accéder à l'état partagé et aux fonctionnalités attachés à un objet extensible commun qui leur est accessible.
Modèle IExtensibleObject<T>
Le modèle d'objet extensible contient trois interfaces : IExtensibleObject, IExtension et IExtensionCollection.
L'interface IExtensibleObject est implémentée par les types qui permettent aux objets IExtension de personnaliser leurs fonctionnalités.
Les objets extensibles autorisent l'agrégation dynamique d'objets IExtension. Les objets IExtension sont caractérisés par l'interface suivante :
public interface IExtension<T>
where T : IExtensibleObject<T>
{
void Attach(T owner);
void Detach(T owner);
}
La restriction de type garantit que les extensions ne peuvent être définies que pour les classes IExtensibleObject. Attach et Detach et qui fournissent une notification de l'agrégation ou de la désagrégation.
Il est valide pour les implémentations d'appliquer des restrictions lorsqu'elles peuvent être ajoutées et supprimées d'un propriétaire. Par exemple, vous pouvez complètement interdire la suppression en interdisant l'ajout ou la suppression des extensions lorsque le propriétaire ou l'extension est dans un certain état, interdire l'ajout simultané à plusieurs propriétaires ou autoriser uniquement un ajout unique suivi par une suppression unique.
IExtension n'implique pas d'interactions avec d'autres interfaces standard managées. Plus précisément, la méthode System.IDisposable.Dispose sur l'objet de propriétaire ne détache pas normalement ses extensions.
Lorsqu'une extension est ajoutée à la collection, Attach est appelé avant d'entrer dans la collection. Lorsqu'une extension est supprimée de la collection, Detach est appelée après sa suppression. Cela signifie (en supposant une synchronisation correcte) qu'une extension ne peut figurer dans la collection que si elle se situe entre Attach et Detach.
L'objet passé à FindAll ou Find n'a pas besoin d'être IExtension (par exemple, vous pouvez passer tout objet), mais l'extension retournée est un IExtension.
Si aucune extension dans la collection est un IExtension, Find retourne null, et FindAll retourne une collection vide. Si plusieurs extensions implémentent IExtension, Find retourne l'une d'entre elle. La valeur retournée par FindAll est une capture instantanée.
Il y a deux scénarios principaux. Le premier scénario utilise la propriété Extensions comme un dictionnaire basé sur un type pour insérer l'état sur un objet pour permettre à un autre composant de le rechercher à l'aide du type.
Le deuxième scénario utilise les propriétés Attach et Detach pour permettre à un objet de participer à un comportement personnalisé, tel que l'inscription aux événements, l'observation des transitions d'état, etc.
L'interface IExtensionCollection est une collection des objets IExtension qui permettent la récupération de IExtension par son type. System.ServiceModel.IExtensionCollection.Find retourne l'objet le plus récemment ajouté qui est un IExtension de ce type.
Objets extensibles dans Windows Communication Foundation
Il existe quatre objets extensibles dans Windows Communication Foundation (WCF) :
- ServiceHostBase - Il s'agit de la classe de base pour l'hôte du service. Les extensions de cette classe peuvent être utilisées pour étendre le comportement du ServiceHostBase lui-même ou pour stocker l'état pour chaque service.
- InstanceContext - Cette classe connecte une instance du type du service à l'exécution du service. Elle contient des informations sur l'instance et une référence au InstanceContext qui contient ServiceHostBase. Les extensions de cette classe peuvent être utilisées pour étendre le comportement du InstanceContext ou pour stocker l'état pour chaque service.
- OperationContext - Cette classe représente les informations d'opération que l'exécution rassemble pour chaque opération. Cela inclut des informations telles que les en-têtes de message entrant, les propriétés de message entrant, l'identité de sécurité entrante et d'autres informations. Les extensions de cette classe peuvent étendre le comportement de OperationContext ou stocker l'état pour chaque opération.
- IContextChannel - Cette interface tient compte de l'inspection de chaque état pour les canaux et les proxys construits par l'exécution WCF. Les extensions de cette classe peuvent étendre le comportement de IClientChannel ou peuvent l'utiliser pour stocker l'état pour chaque canal.
L'exemple de code suivant montre l'utilisation d'une simple extension pour assurer le suivi des objets InstanceContext.