Contrats de données à compatibilité ascendante

L’une des fonctionnalités du système de contrats de données Windows Communication Foundation (WCF) est que les contrats peuvent évoluer avec le temps sans rupture. Autrement dit, un client avec une version antérieure d'un contrat de données peut communiquer avec un service disposant d'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 Meilleures pratiques : contrôle de version des contrats de données.

Vous pouvez appliquer la plupart des fonctionnalités de suivi des versions dès que besoin lorsque de nouvelles versions d’un contrat de données existant sont créées. Toutefois, une des fonctionnalités de suivi des versions, l’aller-retour, doit être construite dans le type de la première version afin de fonctionner correctement.

Aller-retour

L'aller-retour se produit lorsque des données passent d'une nouvelle version à une version ancienne et reviennent à la nouvelle version d'un contrat de données. L'aller-retour garantit qu'aucunes données ne sont perdues. 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 spécifique, ce dernier doit implémenter l'interface IExtensibleDataObject. L'interface contient une propriété, ExtensionData (retournant le type ExtensionDataObject). 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 des données suivant n'est pas compatible en aval avec les futures modifications.

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

Pour rendre ce type compatible avec les futures modifications (telles que l'ajout d'un nouveau membre de données nommé « numéroTél »), 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 préservées. Elles ne sont pas traitées d'aucune autre façon, sauf pour stockage temporaire. Si l'objet est renvoyé là d'où il est venu, les données d'origine (inconnues) sont également retournées. Par conséquent, les données ont fait aller-retour au point de terminaison d'origine sans perte. Toutefois, notez que si le point de terminaison d'origine exige que les données soient traitées, cette attente n'est pas satisfaite, et le point de terminaison doit détecter d'une façon ou d'une autre la modification et s'en accommoder.

Le type ExtensionDataObject ne contient pas de méthodes ou de propriétés publiques. Il est donc impossible d'accéder directement aux données stockées à l'intérieur de la propriété ExtensionData.

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

Voir aussi