Контракты данных, совместимые с любыми будущими изменениями
Одной из функций системы контрактов данных Windows Communication Foundation (WCF) является развитие контрактов без внесения критических изменений. Это значит, что клиент, использующий старую версию контракта данных, может взаимодействовать со службой, использующей новую версию того же контракта данных, или клиент, использующий новую версию контракта данных, может взаимодействовать со службой, использующей старую версию того же контракта данных. Дополнительные сведения см. в разделе Рекомендации. Управление версиями контракта данных.
Большинство функций управления версиями можно применять по мере необходимости при создании новых версий существующего контакта данных. Однако для правильной работы одну функцию управления версиями, полная совместимость версий, необходимо встраивать в тип из первой версии.
Полная совместимость версий
Полная совместимость версий обеспечивается, когда данные передаются от новой версии к старой и снова в новую версию контракта данных. Полная совместимость версий гарантирует сохранение всех данных. Включение полной совместимости версий обеспечивает прямую совместимость типа с любыми будущими изменениями, поддерживаемыми моделью управления версиями контрактов данных.
Полная совместимость версий для определенного типа возможна только в том случае, если этот тип реализует интерфейс IExtensibleDataObject. Интерфейс имеет одно свойство: ExtensionData (возвращение типа ExtensionDataObject). Это свойство сохраняет любые данные из будущих версий контракта данных, неизвестные в текущей версии.
Пример
Ниже представлен контракт данных, который не обладает прямой совместимостью с будущими изменениями.
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
Чтобы тип был совместим с будущими изменениями (такими как добавление нового члена данных с именем "phoneNumber"), необходимо реализовать интерфейс IExtensibleDataObject.
<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
[DataContract]
public class Person : IExtensibleDataObject
{
[DataMember]
public string fullName;
private ExtensionDataObject theData;
public virtual ExtensionDataObject ExtensionData
{
get { return theData; }
set { theData = value; }
}
}
Если инфраструктура WCF встречает данные, которые не являются частью исходного контракта данных, данные сохраняются в свойстве и хранятся в нем. Обработка данных выполняется только во временном хранилище. Если объект возвращается в место создания, также возвращаются исходные (неизвестные) данные. Следовательно, данные совершают круговой путь к исходной конечной точке и из нее без потерь. Однако следует помнить, что если в исходной конечной точке необходимо выполнить обработку данных, этого не произойдет, и конечная точка должна будет каким-либо образом обнаружить и применить изменение.
Тип ExtensionDataObject не содержит открытых методов или свойств. Таким образом, невозможно получить прямой доступ к данным, хранящимся внутри свойства ExtensionData.
Функцию полной совместимости версий можно отключить, присвоив свойству ignoreExtensionDataObject значение true в конструкторе DataContractSerializer или присвоив свойству IgnoreExtensionDataObject значение true для атрибута ServiceBehaviorAttribute. Если эта функция выключена, десериализатор не будет заполнять свойство ExtensionData, а сериализатор не будет выпускать содержимое свойства.
См. также
Справочник
IExtensibleDataObject
ExtensionDataObject
Основные понятия
Управление версиями контракта данных
Рекомендации. Управление версиями контракта данных