2010-08-08 24 views
7

J'ai converti mon service Web en service wcf avec des contrats de données. En tant que meilleure pratique, il est recommandé et recommandé que DataContracts hérite de IExtensibleDataObject. Je comprends que, en cas d'ajout ou de suppression de datamembers, IExtensibleDataObject est utile. Mais je ne suis pas capable d'obtenir comment les clients accèderont aux datamembres supprimés. Voici mon code:Utilisation de IExtensibleDataObject dans les clients

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")] 
public class MyWebService { 
    [OperationContract] 
    public Employee Add(Employee emp) 
    { 
     // Some Processing 
    } 
} 

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Maintenant, dans ma prochaine version du service web j'apporté quelques modifications à DataContract comme

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 
    [DataMember(IsRequired = true)] public string MiddleName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Cependant mon client qui accède à mon ancienne version du service Web devient maintenant erreur pour ne pas fournir le champ MiddleName. Je suis toujours confus pour l'utilisation de IExtensionDataObject.

Répondre

12

Je crains que ce n'est pas l'utilisation correcte de IExtensibleDataObject, l'interface IExtensibleDataObject est conçue pour supporter la version déclenchement ronde, une lecture de cet article MSDN sur la compatibilité avant:

http://msdn.microsoft.com/en-us/library/ms731083.aspx

Et voici un autre article sur les meilleures pratiques sur les données contractuelles versioning en général: http://msdn.microsoft.com/en-us/library/ms733832.aspx

+1

Qu'est-ce qui est incorrect à ce sujet? .NET génère le champ de sauvegarde automatiquement - et la documentation de Microsoft n'explique pas pourquoi elle doit être virtuelle et pourquoi elle a besoin du champ de sauvegarde spécifié manuellement. – ShadowChaser

11

est l'utilisation incorrecte de IExtensibleDataObject. Vous avez modifié le contrat de données du côté serveur et vous avez marqué un nouveau champ tel que requis, cela signifie que vous avez cassé le versionnage et que rien ne vous aide.

IExtensibleDataObject est destiné à d'autres fins. Supposons que vous avez modifié votre client afin que le contrat de données sur le client contienne MiddleName. Vous définissez maintenant le MiddleName et utilisez l'opération d'ajout de service. Quelle valeur de MiddleName sera dans l'objet Employee retourné? Si vous n'utilisez pas IExtensibleDataObject, la valeur sera null, si vous utilisez IExtensibleDataObject, la valeur sera identique à celle que vous avez définie pour le paramètre d'entrée. Lors de l'utilisation de DataContractSerializer, WCF rejette tous les paramètres non compris.

IExtensibleDataObject évite cela en stockant tous ces paramètres dans une collection spéciale et en les renvoyant au client.

Si vous souhaitez utiliser la gestion des versions de contrat, ignorez les champs obligatoires. C'est la première chose qui va le casser.

Meilleures salutations, Ladislav

0

Rendre la propriété ExtensionData "Virtual" comme indiqué ci-dessous:

public virtual ExtensionDataObject ExtensionData 
{ 
    get { return theData; } 
    set { theData = value; } 
}