Procédure : créer un participant de persistance personnalisé
La procédure suivante permet de créer un participant de persistance. Pour obtenir des exemples d’implémentations de participants de persistance, consultez l’exemple Participating in Persistence (en anglais) et la rubrique Extensibilité du magasin.
Créez une classe dérivant des classes PersistenceParticipant ou PersistenceIOParticipant. En plus de pouvoir participer aux opérations I/O, la classe PersistenceIOParticipant offre les mêmes points d’extensibilité que la classe PersistenceParticipant. Effectuez l'une ou l'ensemble des étapes suivantes :
Implémentez la méthode CollectValues. La méthode CollectValues comprend deux paramètres de dictionnaire : l’un pour le stockage des valeurs accessibles en lecture/écriture et l’autre pour le stockage des valeurs en écriture seule (utilisé ultérieurement dans les requêtes). Dans cette méthode, vous devez remplir ces dictionnaires avec les données propres à un participant de persistance. Chaque dictionnaire contient le nom de la valeur comme clé et la valeur elle-même comme un objet InstanceValue.
Les valeurs du dictionnaire readWriteValues sont fournies comme objets InstanceValue. Les valeurs du dictionnaire en écriture seule sont fournies comme objets InstanceValue avec les valeurs InstanceValueOptions.Optional et InstanceValueOption.WriteOnly définies. Chaque objet InstanceValue fourni par les implémentations CollectValues de l’ensemble des participants de persistance doit avoir un nom unique.
protected virtual void CollectValues(out IDictionary<XName,Object> readWriteValues, out IDictionary<XName,Object> writeOnlyValues) { }
Implémentez la méthode MapValues. La méthode MapValues prend deux paramètres semblables aux paramètres reçus par la méthode CollectValues. Toutes les valeurs recueillies à l’étape CollectValues sont passées par ces paramètres de dictionnaire. Les nouvelles valeurs ajoutées par l’étape MapValues sont ajoutées aux valeurs en écriture seule. Le dictionnaire en écriture seule est utilisé pour fournir des données à une source externe qui n'est pas directement associée aux valeurs d'instance. Chaque valeur fournie par les implémentations de la méthode MapValues de l’ensemble des participants de persistance doit avoir un nom unique.
protected virtual IDictionary<XName,Object> MapValues(IDictionary<XName,Object> readWriteValues,IDictionary<XName,Object> writeOnlyValues) { }
La méthode MapValues fournit des fonctionnalités non fournies par la méthode CollectValues, car elle permet une dépendance sur une autre valeur fournie par un autre participant de persistance qui n'a pas encore été traité par CollectValues.
Implémentez la méthode PublishValues. La méthode PublishValues reçoit un dictionnaire contenant toutes les valeurs chargées depuis le magasin de persistance.
protected virtual void PublishValues(IDictionary<XName,Object> readWriteValues) { }
Implémentez la méthode BeginOnSave si le participant est un participant I/O de persistance. Cette méthode est appelée lors d'une opération d'enregistrement. Dans cette méthode, vous devez effectuer l’adjonction I/O à la persistance (l’enregistrement) des instances de workflow. Si l’hôte utilise une transaction pour la commande de persistance correspondante, la même transaction est fournie dans Transaction.Current. En outre, les PersistenceIOParticipants peuvent rendre publique une spécification de cohérence transactionnelle. Dans ce cas, l’hôte crée une transaction pour l’épisode de persistance si aucune transaction ne serait utilisée sinon.
protected virtual IAsyncResult BeginOnSave(IDictionary<XName,Object> readWriteValues, IDictionary<XName,Object> writeOnlyValues, TimeSpan timeout, AsyncCallback callback, Object state) { }
Implémentez la méthode BeginOnLoad si le participant est un participant I/O de persistance. Cette méthode est appelée lors d'une opération de chargement. Dans cette méthode, vous devez effectuer l’adjonction I/O au chargement d’instances de workflow. Si l’hôte utilise une transaction pour la commande de persistance correspondante, la même transaction est fournie dans Transaction.Current. En outre, les participants I/O de persistance peuvent rendre publique une spécification de cohérence transactionnelle. Dans ce cas, l’hôte crée une transaction pour l’épisode de persistance si aucune transaction ne serait utilisée sinon.
protected virtual IAsyncResult BeginOnLoad(IDictionary<XName,Object> readWriteValues, TimeSpan timeout, AsyncCallback callback, Object state) { }