商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

WCF对Collection&Dictionary的支持


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

Data Contract for Collection

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

namespace Artech.SpecialDataContract.Contract 
{
[DataContract]
public class Order
{
[DataMember]
public Guid OrderID
{ get; set; }

[DataMember]
public DateTime OrderDate
{ get; set; }
}

public class OrderCollection : List<Order>
{

}
}
   下面是Service Contract的定义:

namespace Artech.SpecialDataContract.Contract 
{
[ServiceContract]
public interface IOrderManager
{
[OperationContract(Name = "ProcessWithCollection")]
void Process(OrderCollection orders);
}
   OrderCollection 在XSD中的呈现:
<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/">
<xs:import schemaLocation="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd1"
namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
<xs:complexType name="ArrayOfOrder">
<xs:sequence>
<xs:element minOccurs="0" 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="0" name="OrderDate" type="xs:dateTime"/>
<xs:element
minOccurs="0" name="OrderID" type="ser:guid"/>
</xs:sequence>
</xs:complexType>
<xs:element
name="Order" nillable="true" type="tns:Order"/>
</xs:schema>
   加上通过Add Service Reference默认生成的Class,我们可以很清楚地看出Collection是以Array的形式呈现的(Artech.SpecialDataContract.Client.OrderManagerService.Order[] orders):
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="OrderManagerService.IOrderManager")]
public interface IOrderManager {
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOrderManager/ProcessWithCollection", ReplyAction="http://tempuri.org/IOrderManager/ProcessWithCollectionResponse")]
void ProcessWithCollection(Artech.SpecialDataContract.Client.OrderManagerService.Order[] orders);
}
   因为Array相对很Common的数据类型,基本上所有的厂商均提供了对Array的支持,这也是WCF在通过Add Service Reference生成Client端代码的时候,会生成Array的原因。不过并不是我们只有唯一的选择,事实上VS为此提供了扩展,允许我们对于基于Collection 的Data Contract生成我们需要的各种类型,我们只需要在Add Service Reference的时候选择“Configure Service Reference”进行相应的配置:


   通过上面的截图,我们发现在Collection Type一项我们有若干选项,我们可以选择我们希望生成的数据类型:Array,ArrayList,LinkedList,Generic List,Collection和BindingList。


1 2
【内容导航】
第1页: Data Contract for Collection 第2页: Data Contract for Dictionary
©版权所有。未经许可,不得转载。
[责任编辑:胡铭娅]
[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]