首页 / 软件开发 / WCF / 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持2010-12-29 cnblogs.com artech通过第一部分的介绍,我们可以体会到,WCF 的Data Contract在CLR Type和Neutral Contract之间搭建了一座桥梁,弥合了.NET世界和厂商中立世界的差异。通过WCF Data Contract我们将CLR Data Type暴露成一个厂商中立的数据结构的描述,同样通过WCF Data Contract我们将一个现有的CLR Data Type和既定的Neutral contract进行适配。在.NET中,基于Primary Type,比如Int32,String等等,他们具有一个简单的默认的序列化方式和结构,可以说他们不需要Data Contract。接下来我们主要讨论的是一些相对比较特殊的、完全基于.NET的Data Type,比如Generic、Collection,和Dictionary。首先,我们结合例子来谈谈基于Generic的Data Type的Data Contract。假设我们需要创建一个用于处理一些单据(Bill)的Service,比如如Order Bill、Sales Bill等。一般的单据都有一个单据头(Header)和明细(Detail)列表,为此我们创建了一个Generic的Bill。并namespace Artech.SpecialDataContract.Contract
{
[DataContract]
public class Bill<THeader, TDetail>
{
[DataMember]
public THeader Header
{ get; set; }
[DataMember]
public IList<TDetail> DetailList
{ get; set; }
}
[DataContract]
public class OrderHeader
{
[DataMember]
public Guid OrderID
{ get; set; }
[DataMember]
public DateTime OrderDate
{ get; set; }
}
[DataContract]
public class OrderDetail
{
[DataMember]
public Guid ProductID
{ get; set; }
[DataMember]
public int Quantity
{ get; set; }
}
}
为处理订单单据创建了机遇订单的Header和Detail。对于一个Neutral Service Contract和Neutral Data Contract本身是不可能支持Generic的,也就是Neutral Contract只能是对一个具体的CLR Type的体现。所以在定义Service Contract的时候,对于那些包含Generic Type作为参数或者返回值得Operation,我们必须指定一个具体的Data Type。所以我们创建了如下一个IBillManager Service Contract:namespace Artech.SpecialDataContract.Contract
{
[ServiceContract]
public interface IBillManager
{
[OperationContract]
void Procss(Bill<OrderHeader, OrderDetail> orderBill);
}
}