客户端中的IExtensibleDataObject用法

我已将我的Web服务转换为具有一些数据交换的wcf服务。 作为最佳实践,我们提到并建议DataContracts应inheritance自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; } } 

现在,在我的下一个Web服务版本中,我对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; } } 

但是,正在访问我的旧版Web服务的客户端现在因未提供MiddleName字段而收到错误。 我仍然对IExtensionDataObject的使用感到困惑。

我担心这不是IExtensibleDataObject的正确用法,IExtensibleDataObject接口旨在支持版本往返,请阅读这篇关于向前兼容性的MSDN文章:

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

这是另一篇关于数据合约版本控制最佳实践的文章: http : //msdn.microsoft.com/en-us/library/ms733832.aspx

这是IExtensibleDataObject的错误用法。 您已在服务器端修改了数据合同,并且已根据需要标记了新字段,因此这意味着您已经破坏了版本,并且没有任何帮助您。

IExtensibleDataObject用于其他目的。 假设您已修改了客户端,以便客户端上的数据协定包含MiddleName。 现在设置MiddleName并使用Add service操作。 MiddleName在返回的Employee对象中的值是多少? 如果不使用IExtensibleDataObject,则该值将为null,如果使用IExtensibleDataObject,则该值将与您设置为输入参数的值相同。

使用DataContractSerializer时,WCF会抛弃所有未理解的参数。 IExtensibleDataObject通过将所有这些参数存储在特殊集合中并将它们发送回客户端来避免这种情况。

如果要使用合同版本控制,请忘记必填字段。 这是打破它的第一件事。

最好的问候,拉迪斯拉夫

使ExtensionData属性“虚拟”,如下所示:

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