[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持...

在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList<TDetail> DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList)。我们现在就来详细地讨论一下基于Collection & Dictionary Data Contract

Data Contract for Collection

我们照例用例子来说明问题,在这里我们创建一个批量处理
OrderService,于是我们创建了一个OrderCollection Type:

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...namespaceArtech.SpecialDataContract.Contract
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataContract]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicclassOrder
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataMember]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicGuidOrderID
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{get;set;}
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataMember]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicDateTimeOrderDate
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{get;set;}
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicclassOrderCollection:List<Order>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

下面是Service Contract的定义:

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...namespaceArtech.SpecialDataContract.Contract
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[ServiceContract]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicinterfaceIOrderManager
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[OperationContract(Name
="ProcessWithCollection")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
voidProcess(OrderCollectionorders);
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

面是OrderCollection XSD中的呈现:

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...<?xmlversion="1.0"encoding="utf-8"?>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:schemaelementFormDefault="qualified"targetNamespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...xmlns:xs
="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...xmlns:ser
="http://schemas.microsoft.com/2003/10/Serialization/">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:importschemaLocation="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd1"
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...namespace
="http://schemas.microsoft.com/2003/10/Serialization/"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:complexTypename="ArrayOfOrder">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementminOccurs="0"maxOccurs="unbounded"name="Order"nillable="true"type="tns:Order"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:complexType>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementname="ArrayOfOrder"nillable="true"type="tns:ArrayOfOrder"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:complexType
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
name="Order">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementminOccurs="0"name="OrderDate"type="xs:dateTime"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:element
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
minOccurs="0"name="OrderID"type="ser:guid"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:complexType>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:element
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
name="Order"nillable="true"type="tns:Order"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:schema>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

加上通过Add Service Reference默认生成的Class,我们可以很清楚地看出Collection是以Array的形式呈现的(Artech.SpecialDataContract.Client.OrderManagerService.Order[] orders):

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel","3.0.0.0")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.ServiceModel.ServiceContractAttribute(ConfigurationName
="OrderManagerService.IOrderManager")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicinterfaceIOrderManager[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.ServiceModel.OperationContractAttribute(Action
="http://tempuri.org/IOrderManager/ProcessWithCollection",ReplyAction="http://tempuri.org/IOrderManager/ProcessWithCollectionResponse")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
voidProcessWithCollection(Artech.SpecialDataContract.Client.OrderManagerService.Order[]orders);
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

因为Array相对很Common的数据类型,基本上所有的厂商均提供了对Array的支持,这也是WCF在通过AddService Reference生成Client端代码的时候,会生成Array的原因。不过并不是我们只有唯一的选择,事实上VS为此提供了扩展,允许我们对于基于Collection Data Contract生成我们需要的各种类型,我们只需要在Add Service Reference的时候选择“Configure Service Reference”进行相应的配置:

通过上面的截图,我们发现在Collection Type一项我们有若干选项,我们可以选择我们希望生成的数据类型:ArrayArrayListLinkedListGeneric ListCollectionBindingList

Data Contract for Dictionary

前面的内容,我们分别讨论了基于GenericCollectionData Contract,接下来,我们来讨论最后一个特殊的数据类型的Data ContractDictionary

延续上面的Order Batch Processing的例子,不过我们现在处理的不是一个OrderCollection对象,而是一个Dictionary对象,线面是Service ContractOrder的定义:

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...namespaceArtech.SpecialDataContract.Contract
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[ServiceContract]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicinterfaceIOrderManager
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[OperationContract(Name
="ProcessWithCollection")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
voidProcess(OrderCollectionorders);
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[OperationContract(Name
="ProcessWithDictionary")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
voidProcess(IDictionary<Guid,Order>orders);
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataContract]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicclassOrder
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataMember]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicGuidOrderID
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{get;set;}
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[DataMember]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicDateTimeOrderDate
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{get;set;}
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

闲话少说,我们来看XSD

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...<?xmlversion="1.0"encoding="utf-8"?>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:schemaelementFormDefault="qualified"targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:importschemaLocation="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd1"namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:importschemaLocation="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd2"namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:complexTypename="ArrayOfKeyValueOfguidOrder_SkVQi6O3">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:annotation>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:appinfo>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<IsDictionaryxmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:appinfo>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:annotation>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementminOccurs="0"maxOccurs="unbounded"name="KeyValueOfguidOrder_SkVQi6O3">
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:complexType>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementname="Key"type="ser:guid"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementname="Value"nillable="true"type="q1:Order"xmlns:q1="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:complexType>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:element>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:sequence>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:complexType>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
<xs:elementname="ArrayOfKeyValueOfguidOrder_SkVQi6O3"nillable="true"type="tns:ArrayOfKeyValueOfguidOrder_SkVQi6O3"/>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
</xs:schema>
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

Data Contract的名称为ArrayOfKeyValueOfguidOrder_SkVQi6O3=ArrayOfKeyValueOf+guidKey的类型)+OrderValue+_SkVQi6O3Hash Value)。从该XSD的结构我们不难看出,只是一个数组,每个元素为Key-Value pair

我们照例看看通过Add Service Reference方式生成的Clientcode中的对应的定义:

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel","3.0.0.0")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.ServiceModel.ServiceContractAttribute(ConfigurationName
="OrderManagerService.IOrderManager")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
publicinterfaceIOrderManager[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...{
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...[System.ServiceModel.OperationContractAttribute(Action
="http://tempuri.org/IOrderManager/ProcessWithDictionary",ReplyAction="http://tempuri.org/IOrderManager/ProcessWithDictionaryResponse")]
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...
voidProcessWithDictionary(System.Collections.Generic.Dictionary<System.Guid,Artech.SpecialDataContract.Client.OrderManagerService.Order>orders);
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...}

[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

生成的是一个System.Collections.Generic.Dictionary类型。同Collection一样,也依然可以有多种选择:
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection &amp; Dictionary的支持...

[原创]谈谈WCF中的Data Contract(1):Data Contract Overview
[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
[原创]谈谈WCF中的Data Contract(4):WCF Data Contract Versioning