IExtensibleDataObject实现向前和向后兼容性

时间:2010-12-27 10:28:23

标签: wcf versioning soa iextensibledataobject

  1. 我没有在服务器的DC中实现此接口。

  2. 虽然我自动在客户端生成了VS2008生成的这个实现,但没问题。

  3. 现在我去编辑我的Reference.cs以包含一个新字段(区分特定服务方法的服务器DC(输入参数))

  4. 编译,运行指向旧服务的代码,虽然我将新字段的值(示例布尔类型设置为true)忽略了我的值,但它的工作正常。

  5. 那么为什么要在服务器上实现DC

  6. 我期待向前兼容,它运作正常。

  7. 现在我删除了我在#3中添加的代码。编译。

  8. 而是在服务器DC编译中添加了相同的字段。

  9. 现在我运行从客户端向服务器发送较少数据的代码DC有更多列。它工作正常。这意味着向后兼容性工作正常吗?

  10. 希望我的理解不正确?

  11. 我的环境是.Net 3.5 Sp1

1 个答案:

答案 0 :(得分:1)

IExtensibleDataObject用于不同目的。假设您有以下操作:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
}

[ServiceContract]
public class MyService
{
  [OperationContract]
  public MyObject Operation(MyObject object)
  {
    object.MyMember += " modified";
    return object;
  }
}

预期的行为是Operation返回修改后的参数。

现在假设您在客户端修改数据合同:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
  [DataMember]
  public string MyNewMember { get; set; }
}

现在让我们调用操作:

var client = new MyServiceClient();
var myObject = new MyObject
  {
    MyMember = "Member",
    MyNewMember = "Some value"
  }; 

MyObject returnedObject = client.Operation(myObject);

服务的数据协定没有实现IExtensibleDataObject,也不知道MyNewMember属性。 returnObject.MyNewMember中的值是多少?它将为null。但是如果你在服务器端实现IExtensibleDataObject,它将是“一些值”,即使服务器对这个属性一无所知。