谈谈WCF中的Data Contract(4):WCF Data Contract Versioning2010-12-29 cnblogs.com artech是一门独特的工程艺术,需要解决的是不断改变的需求变化。而对于WCF,对于SOA,由于涉及的是对多个系统之间的交互问题,如何有效地解决不断改变的需求所带来的问题就显得更为重要:Service端版本的变化能否保持现有Consumer的正常调用,Consumer端的改变不至于影响对Service 的正常调用。对于Data Contract来说就是要解决这样的问题:Service端或者Client对Data Type的改变不会影响Service的正常调用。在系统开发过程中,通过对Data Type添加额外的字段进而对其进行扩展,是一个种很常见的场景。本部分就作中介绍Data Contract的这种变化,Service或者Client的Data Contract在本地添加一个新的Data Member会造成怎样的影响,WCF可以采用怎样的机制来解决这种单方面Data Contract版本的改变。我们同样通过Dome来说话。在这个Demo中,我使用上面介绍的Order Processing的场景,下面是整个Solution的结构(需要说明的是,本片文章提供的Code片断和Source Code都是基于VS 2008的)。1.Service端: Artech.DataContractVersioning.ServiceData Contractusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization;
namespace Artech.DataContractVersioning.Service { [DataContract(Namespace="http://artech.datacontractversioning")] public class Order { [DataMember(Order = 0)] public Guid OrderID {get;set;}
[DataMember(Order = 1)] public DateTime OrderDate { get; set; }
[DataMember(Order = 2)] public Guid SupplierID { get; set; } } }Service Contract 和Service Implementation: Process方法简单地将Order对象返回到客户端,当Client接受到Service返回的Order对象后,可以检测和由它传递给Service的Order对象有什么不同。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel;
namespace Artech.DataContractVersioning.Service { [ServiceContract] public interface IOrderManager { [OperationContract] Order Process(Order order); } }
namespace Artech.DataContractVersioning.Service { public class OrderManagerService:IOrderManager { IOrderManager Members#region IOrderManager Members
public Order Process(Order order) { return order; }