IExtensibleDataObject vs IExtensibleObject?

时间:2011-06-01 23:47:56

标签: c# wcf .net-4.0

我试图找出IExtensibleDataObject和IExtensibleObject之间的区别。

MSDN说第一个(IExtensibleDataObject)是让可能已添加属性的对象的反序列化和第二个(IExtensibleObject)看起来非常相似,它确实让对象添加了属性太

我很困惑。

2 个答案:

答案 0 :(得分:19)

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方法时,它将传递一个在服务器上无效的实例(Address将为null)。

IEDO所做的是启用这种情况,其中现有(传统)客户端可以继续从服务接收新版本的数据合同 - 客户端将使用服务中的数据填充它理解的字段,以及它所做的那些元素理解将存储在ExtensionDataObject中,以便以后可以重新序列化。在上面的示例中,旧版客户端只能读取Person的Name和Age属性,但是当它将对象发送回服务器时,序列化数据将包含所有三个属性。

这是关于IEDO的长篇故事。 IExtensibleObject与序列化没有任何关系 - 是关于将扩展连接到WCF 服务堆栈中的某些预定义对象(主机,操作上下文,实例)上下文和上下文通道)。不像IEDO那么有趣,所以我会在这里停下来:))

已修改:为了完整起见,如果您想了解有关IExtensibleObject的更多信息,可以查看http://blogs.msdn.com/b/carlosfigueira/archive/2012/01/31/wcf-extensibility-iextension-and-iextensibleobject.aspx上的帖子。

答案 1 :(得分:6)

IExtensibleDataObject用于容纳服务消息中的额外数据(可能是生成代理时合同未指定的数据)。

IExtensibleObject用于扩展WCF引擎的某些方面(例如ServiceHostBase和InstanceContext)。

名称听起来很相似,但它们只是用于不同目的的不同界面。