Использование IExtensibleDataObject в клиентах

Я преобразовал свой веб-сервис в сервис 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.

8
задан gerleim 1 September 2016 в 00:51
поделиться

2 ответа

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

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

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

12
ответ дан 5 December 2019 в 06:36
поделиться

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

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

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

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

С уважением, Ладислав

13
ответ дан 5 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: