电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

WCF中的Data Contract:WCF Data Contract对Collection和D


发布日期:2020/5/20
 

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

上一篇:“不完美”的VS 2005 Team System

下一篇:internal heap limit reached问题的解决