我试图找出IExtensibleDataObject和IExtensibleObject之间的区别.
MSDN说第一个(IExtensibleDataObject)是让可能具有添加属性的对象的反序列化和第二个(IExtensibleObject)看起来非常相似,它确实让对象添加属性.
我很迷惑.
car*_*ira 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;
}
Run Code Online (Sandbox Code Playgroud)
您使用此数据类型部署服务,并且您有一些客户端使用此类型.某些服务操作将Person返回给客户端,客户端可以将这些对象发送回服务,如下例所示.
[ServiceContract]
public interface ITest {
[OperationContract] Person[] GetAllPeople();
[OperationContract] void DoSomething(Person person);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有效,直到业务逻辑的更改要求将新成员添加到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;
}
Run Code Online (Sandbox Code Playgroud)
如果没有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.
IExtensibleDataObject用于容纳服务消息中的额外数据(可能是生成代理时未由合同指定的数据).
IExtensibleObject用于扩展WCF引擎的某些方面(例如ServiceHostBase和InstanceContext).
名称听起来很相似,但它们只是用于不同目的的不同接口.