我已将我的网络服务转换为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; }
}
现在,在我的下一版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的使用感到困惑。
答案 0 :(得分:13)
这是IExtensibleDataObject的错误用法。您已经在服务器端修改了数据合同,并且您已根据需要标记了新字段,这意味着您已经破坏了版本,没有任何帮助。
IExtensibleDataObject用于其他目的。假设您已修改了客户端,以便客户端上的数据协定包含MiddleName。现在设置MiddleName并使用Add service操作。 MiddleName在返回的Employee对象中的值是多少?如果不使用IExtensibleDataObject,则该值将为null,如果使用IExtensibleDataObject,则该值将与您设置为输入参数的值相同。
使用DataContractSerializer时,WCF会抛弃所有未理解的参数。 IExtensibleDataObject通过将所有这些参数存储在特殊集合中并将它们发送回客户端来避免这种情况。
如果您想使用合约版本控制,请忘记必填字段。这是破坏它的第一件事。
祝你好运, 拉吉斯拉夫
答案 1 :(得分:12)
我担心这不是IExtensibleDataObject的正确用法,IExtensibleDataObject接口旨在支持版本往返,请阅读这篇关于向前兼容性的MSDN文章:
http://msdn.microsoft.com/en-us/library/ms731083.aspx
这是另一篇关于数据合同版本控制最佳实践的文章: http://msdn.microsoft.com/en-us/library/ms733832.aspx
答案 2 :(得分:0)
使ExtensionData属性为“Virtual”,如下所示:
public virtual ExtensionDataObject ExtensionData
{
get { return theData; }
set { theData = value; }
}