Использование IExtensibleDataObject в клиентах - PullRequest
8 голосов
/ 08 августа 2010

Я преобразовал свой веб-сервис в сервис wcf, который имеет несколько контрактов на передачу данных.Рекомендуется упомянуть и рекомендовать, чтобы DataContracts наследовался от IExtensibleDataObject.Я понимаю, что в случае добавления или удаления камер данных, IExtensibleDataObject полезен.Но я не могу понять, как клиенты получат доступ к удаленным пользователям.Вот мой код:

[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; }
}

Теперь в моей следующей версии веб-службы я внес некоторые изменения в DataContract как

[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; }
}

Однако мой клиент, который обращается к моей старой версии веб-службытеперь получаю сообщение об ошибке из-за отсутствия поля MiddleName.Я все еще запутался в использовании IExtensionDataObject.

Ответы [ 3 ]

13 голосов
/ 09 августа 2010

, что является неправильным использованием IExtensibleDataObject. Вы изменили контракт данных на стороне сервера и пометили новое поле как обязательное, что означает, что вы нарушили управление версиями, и ничто не поможет вам.

IExtensibleDataObject предназначен для других целей. Предположим, что вы изменили свой клиент так, чтобы контракт данных на клиенте содержал MiddleName. Теперь вы устанавливаете MiddleName и используете операцию добавления сервиса. Какое значение MiddleName будет в возвращенном объекте Employee? Если вы не используете IExtensibleDataObject, значение будет равно нулю, если вы используете IExtensibleDataObject, значение будет таким же, как для параметра ввода.

При использовании DataContractSerializer WCF выбрасывает все непонятные параметры. IExtensibleDataObject позволяет избежать этого, сохраняя все эти параметры в специальной коллекции и отправляя их обратно клиенту.

Если вы хотите использовать контрактное управление версиями, забудьте о необходимых полях. Это первое, что сломает его.

С наилучшими пожеланиями, Ладислав

12 голосов
/ 09 августа 2010

Боюсь, что это неправильное использование IExtensibleDataObject, интерфейс IExtensibleDataObject предназначен для поддержки циклического переключения версий, прочитайте эту статью MSDN о прямой совместимости:

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

А вот еще одна статья о лучших практиках управления версиями Data Contract в целом: http://msdn.microsoft.com/en-us/library/ms733832.aspx

0 голосов
/ 13 января 2014

Сделайте свойство ExtensionData виртуальным, как показано ниже:

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