Data Contract for Collection 我们照例用例子来说明问题在这里我们创建一个批量处理Order的Service于是我们创建了一个OrderCollection Type namespace ArtechSpecialDataContractContract { [DataContract] public class Order { [DataMember] public Guid OrderID { get; set; } [DataMember] public DateTime OrderDate { get; set; } } public class OrderCollection : List{ } } 下面是Service Contract的定义 namespace ArtechSpecialDataContractContract { [ServiceContract] public interface IOrderManager { [OperationContract(Name = ProcessWithCollection)] void Process(OrderCollection orders); } 面是OrderCollection 在XSD中的呈现 <?xml version= encoding=utf ?> <xs:schema elementFormDefault=qualified targetNamespace=
xmlns:xs= xmlns:tns= xmlns:ser=> <xs:import schemaLocation=d namespace= /> <xs:complexType name=ArrayOfOrder> <xs:sequence> <xs:element minOccurs= maxOccurs=unbounded name=Order nillable=true type=tns:Order /> </xs:sequence> </xs:complexType> <xs:element name=ArrayOfOrder nillable=true type=tns:ArrayOfOrder/> <xs:complexType name=Order> <xs:sequence> <xs:element minOccurs= name=OrderDate type=xs:dateTime/> <xs:element minOccurs= name=OrderID type=ser:guid/> </xs:sequence> </xs:complexType> <xs:element name=Order nillable=true type=tns:Order/> </xs:schema> [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName="OrderManagerService. IOrderManager")] public interface IOrderManager { [System.ServiceModel.OperationContractAttribute(Action= "", ReplyAction=" ProcessWithCollectionResponse")] void ProcessWithCollection(Artech.SpecialDataContract.Client.OrderManagerService. Order[] orders); }
因为Array相对很Common的数据类型,基本上所有的厂商均提供了对Array的支持,这也是WCF在通过Add Service Reference生成Client端代码的时候,会生成Array的原因。Tw.wINgWiT.coM不过并不是我们只有唯一的选择,事实上VS为此提供了扩展,允许我们对于基于Collection 的Data Contract生成我们需要的各种类型,我们只需要在Add Service Reference的时候选择“Configure Service Reference”进行相应的配置: 通过上面的截图,我们发现在Collection Type一项我们有若干选项,我们可以选择我们希望生成的数据类型:Array,ArrayList,LinkedList,Generic List,Collection和BindingList。 Data Contract for Dictionary 前面的内容,我们分别讨论了基于Generic和Collection的Data Contract,接下来,我们来讨论最后一个特殊的数据类型的Data Contract:Dictionary。 延续上面的Order Batch Processing的例子,不过我们现在处理的不是一个OrderCollection对象,而是一个Dictionary对象,线面是Service Contract和Order的定义: namespace Artech.SpecialDataContract.Contract { [ServiceContract] public interface IOrderManager { [OperationContract(Name = "ProcessWithCollection")] void Process(OrderCollection orders); [OperationContract(Name = "ProcessWithDictionary")] void Process(IDictionary orders);} } [DataContract] public class Order { [DataMember] public Guid OrderID { get; set; } [DataMember] public DateTime OrderDate { get; set; } } 闲话少说,我们来看XSD: <?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="" xmlns:xs="" xmlns:tns="" xmlns:ser=""> <xs:import schemaLocation= "d1" namespace=""/> <xs:import schemaLocation= "d2" namespace=""/> <xs:complexType name="ArrayOfKeyValueOfguidOrder_SkVQi6O3"> <xs:annotation> <xs:appinfo> <IsDictionary xmlns= "true">true</IsDictionary> </xs:appinfo> </xs:annotation> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="KeyValueOfguidOrder_SkVQi6O3"> <xs:complexType> <xs:sequence> <xs:element name="Key" type="ser:guid"/> <xs:element name="Value" nillable="true" type="q1:Order" xmlns:q1=""/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfKeyValueOfguidOrder_SkVQi6O3" nillable="true" type="tns:ArrayOfKeyValueOfguidOrder_SkVQi6O3"/> </xs:schema> Data Contract的名称为ArrayOfKeyValueOfguidOrder_SkVQi6O3=ArrayOfKeyValueOf+guid(Key的类型)+Order(Value)+_SkVQi6O3(Hash Value)。从该XSD的结构我们不难看出,只是一个数组,每个元素为Key-Value pair。
我们照例看看通过Add Service Reference方式生成的Client端code中的对应的定义: [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName= "OrderManagerService.IOrderManager")] public interface IOrderManager { [System.ServiceModel.OperationContractAttribute(Action= "", ReplyAction="")] void ProcessWithDictionary(System.Collections.Generic.Dictionary<System.Guid, Artech.SpecialDataContract.Client.OrderManagerService.Order> orders); } 生成的是一个System.Collections.Generic.Dictionary类型。同Collection一样,也依然可以有多种选择: 498)this.width=498;"> 图1 |