IExtensibleDataObject против IExtensibleObject? - PullRequest
10 голосов
/ 02 июня 2011

Я пытаюсь выяснить, в чем разница между IExtensibleDataObject и IExtensibleObject.

MSDN говорит, что первый ( IExtensibleDataObject ) должен позволить десериализации объекта, который мог добавитьАтрибут и второй ( IExtensibleObject ) выглядят очень похоже, он также позволяет объекту добавлять атрибут.

Я в замешательстве.

Ответы [ 2 ]

19 голосов
/ 02 июня 2011

IExtensibleDataObject о сериализации, и его можно использовать за пределами стека службы WCF. Его основная цель - обходить разные версии контракта данных без потери информации. Например, в первой версии вашего контракта у вас есть такой тип:

[DataContract(Name = "Person")]
public class Person : IExtensibleDataObject {
   ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; }
   [DataMember(Order = 0)] public string Name;
   [DataMember(Order = 1)] public int Age;
}

Вы разворачиваете свои службы с этим типом данных, и у вас есть клиенты, использующие этот тип. Некоторые сервисные операции возвращают Person клиенту, и клиент может отправить эти объекты обратно в сервис, как в примере ниже.

[ServiceContract]
public interface ITest {
    [OperationContract] Person[] GetAllPeople();
    [OperationContract] void DoSomething(Person person);
}

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

[DataContract(Name = "Person")]
public class Person_V2 : IExtensibleDataObject {
   ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; }
   [DataMember(Order = 0)] public string Name;
   [DataMember(Order = 1)] public int Age;
   [DataMember(Order = 2)] public string Address;
}

Без IExtensibleDataObject существующие клиенты получают объект Person, заполняют его свойство Name / Age и незамедлительно отбрасывают переданный ему элемент Address. И когда он вызывает метод DoSomething с этим объектом, он передает экземпляр, который будет недействительным на сервере (адрес будет нулевым).

Что делает IEDO, так это включает этот сценарий, при котором существующие (устаревшие) клиенты могут продолжать получать новые версии контрактов на данные от службы - клиент заполняет поля, которые он понимает, данными из службы и теми элементами, которые он не делает. непонятно, будут ли храниться в ExtensionDataObject, чтобы их можно было повторно идентифицировать позже. В приведенном выше примере устаревшие клиенты смогут только читать свойства «Имя» и «Возраст» объекта Person, но при отправке объекта обратно на сервер сериализованные данные будут содержать все три свойства.

Это была длинная история о IEDO. IExtensibleObject не имеет ничего общего с сериализацией - речь идет о подключении расширений к некоторым предопределенным объектам в стеке WCF service (хост, контекст операции, контекст экземпляра и контекстный канал). Не так интересно, как IEDO, поэтому я остановлюсь здесь:)

Отредактировано : для полноты информации, если вам нужна дополнительная информация о IExtensibleObject, вы можете проверить сообщение по адресу http://blogs.msdn.com/b/carlosfigueira/archive/2012/01/31/wcf-extensibility-iextension-and-iextensibleobject.aspx.

6 голосов
/ 02 июня 2011

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

IExtensibleObject используется для расширения определенных аспектов механизма WCF (таких как ServiceHostBase и InstanceContext).

Названия звучат одинаково, но это просто разные интерфейсы для разных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...