Partager via


contrats de données Forward-Compatible

Une caractéristique du système de contrat de données de Windows Communication Foundation (WCF) est que les contrats peuvent évoluer au fil du temps sans rupture. Autrement dit, un client disposant d’une version antérieure d’un contrat de données peut communiquer avec un service avec une version plus récente du même contrat de données, ou un client avec une version plus récente d’un contrat de données peut communiquer avec une version antérieure du même contrat de données. Pour plus d’informations, consultez Les meilleures pratiques : Gestion des versions de contrat de données.

Vous pouvez appliquer la plupart des fonctionnalités de contrôle de version en fonction des besoins lorsque de nouvelles versions d’un contrat de données existant sont créées. Toutefois, une fonctionnalité de contrôle de version, aller-retour, doit être intégrée dans le type dès la première version pour fonctionner correctement.

Aller-retour

L’aller-retour se produit lorsque les données passent d’une nouvelle version à une ancienne version et revenent à la nouvelle version d’un contrat de données. L’aller-retour garantit qu’aucune donnée n’est perdue. L'activation de l'aller-retour rend le type compatible en aval avec toutes les modifications futures prises en charge par le modèle du suivi des versions du contrat de données.

Pour activer l’aller-retour pour un type particulier, le type doit implémenter l’interface IExtensibleDataObject . L’interface contient une propriété ( ExtensionData renvoyant le ExtensionDataObject type). La propriété stocke les données des futures versions du contrat de données qui est inconnu de la version actuelle.

Exemple :

Le contrat de données suivant n’est pas compatible avec les modifications futures.

[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}
<DataContract()> _
Public Class Person
    <DataMember()> _
    Public fullName As String
End Class

Pour rendre le type compatible avec les modifications futures (par exemple, l’ajout d’un nouveau membre de données nommé « phoneNumber »), implémentez l’interface IExtensibleDataObject .

[DataContract]
public class Person : IExtensibleDataObject
{
    [DataMember]
    public string fullName;
    private ExtensionDataObject theData;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return theData; }
        set { theData = value; }
    }
}
<DataContract()> _
Public Class Person
    Implements IExtensibleDataObject
    <DataMember()> _
    Public fullName As String
    Private theData As ExtensionDataObject


    Public Overridable Property ExtensionData() As _
     ExtensionDataObject Implements _
     IExtensibleDataObject.ExtensionData
        Get
            Return theData
        End Get
        Set
            theData = value
        End Set
    End Property
End Class

Lorsque l’infrastructure WCF rencontre des données qui ne font pas partie du contrat de données d’origine, les données sont stockées dans la propriété et conservées. Il n’est pas traité d’une autre manière, sauf pour le stockage temporaire. Si l’objet est retourné à l’endroit où il provient, les données d’origine (inconnues) sont également retournées. Par conséquent, les données ont effectué un aller-retour vers et depuis le point de terminaison d’origine sans perte. Notez toutefois que si le point de terminaison d’origine a requis le traitement des données, que l’attente n’est pas satisfaite et que le point de terminaison doit en quelque sorte détecter et prendre en charge la modification.

Le ExtensionDataObject type ne contient aucune méthode ou propriété publique. Par conséquent, il est impossible d’obtenir un accès direct aux données stockées à l’intérieur de la ExtensionData propriété.

La fonctionnalité d’aller-retour peut être désactivée, soit en définissant ignoreExtensionDataObject sur true dans le constructeur DataContractSerializer, soit en définissant la propriété IgnoreExtensionDataObject sur true dans le ServiceBehaviorAttribute. Lorsque cette fonctionnalité est désactivée, le désérialiseur ne remplit pas la ExtensionData propriété et le sérialiseur n’émet pas le contenu de la propriété.

Voir aussi