加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – IExtensibleDataObject与IExtensibleObject?

发布时间:2020-12-15 06:49:19 所属栏目:百科 来源:网络整理
导读:我想弄清楚IExtensibleDataObject和IExtensibleObject之间有什么区别. MSDN说,第一个(IExtensibleDataObject)是让可能添加属性的对象的反序列化,而第二个(IExtensibleObject)看起来非常相似,它也允许对象添加属性. 我很困惑. 解决方法 IExtensibleDataObject
我想弄清楚IExtensibleDataObject和IExtensibleObject之间有什么区别.

MSDN说,第一个(IExtensibleDataObject)是让可能添加属性的对象的反序列化,而第二个(IExtensibleObject)看起来非常相似,它也允许对象添加属性.

我很困惑.

解决方法

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,而后备数据库要求该字段存在(不为null).

[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的帖子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读