文档章节

谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持

ATBBE
 ATBBE
发布于 2016/06/28 15:15
字数 1008
阅读 2
收藏 0
在本篇文章上一部分 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:

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

        [DataMember]
        
public DateTime OrderDate
        
getset; }
    }


    
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一项我们有若干选项,我们可以选择我们希望生成的数据类型:ArrayArrayListLinkedListGeneric ListCollectionBindingList 

Data Contract for Dictionary

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

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

namespace  Artech.SpecialDataContract.Contract
{
    [ServiceContract]
    
public interface IOrderManager
    
{
        [OperationContract(Name 
= "ProcessWithCollection")]
        
void Process(OrderCollection orders);

        [OperationContract(Name 
= "ProcessWithDictionary")]
        
void Process(IDictionary<Guid, Order> orders);
    }

}

 

    [DataContract]
    
public   class  Order
    
{
        [DataMember]
        
public Guid OrderID
        
getset; }

        [DataMember]
        
public DateTime OrderDate
        
getset; }
    }

闲话少说,我们来看XSD

<? xml version="1.0" encoding="utf-8" ?>
< xs:schema  elementFormDefault ="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/" >
  
< xs:import  schemaLocation ="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd1"  namespace ="http://schemas.microsoft.com/2003/10/Serialization/" />
  
< xs:import  schemaLocation ="http://artech/Artech.SpecialDataContract/OrderManagerService.svc?xsd=xsd2"  namespace ="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract" />
  
< xs:complexType  name ="ArrayOfKeyValueOfguidOrder_SkVQi6O3" >
    
< xs:annotation >
      
< xs:appinfo >
        
< IsDictionary  xmlns ="http://schemas.microsoft.com/2003/10/Serialization/" > 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 ="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract" />
          
</ 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+guidKey的类型)+OrderValue+_SkVQi6O3Hash Value)。从该XSD的结构我们不难看出,只是一个数组,每个元素为Key-Value pair

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

    [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/ProcessWithDictionary", ReplyAction="http://tempuri.org/IOrderManager/ProcessWithDictionaryResponse")]
        
void ProcessWithDictionary(System.Collections.Generic.Dictionary<System.Guid, Artech.SpecialDataContract.Client.OrderManagerService.Order> orders);
    }

生成的是一个System.Collections.Generic.Dictionary类型。同Collection一样,也依然可以有多种选择:


[原创]谈谈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

本文转载自:http://www.cnblogs.com/artech/archive/2007/11/27/974665.html

ATBBE
粉丝 4
博文 530
码字总数 2825
作品 0
徐汇
私信 提问
谈谈WCF中的Data Contract (1):Data Contract Overview

Contract in SO:Contract是对操作和数据的抽象 在我们看来,Service Orientation提供了一种对业务、功能进行分解的方式。针对SO,我们把一个具体的业务流程或者一个复杂的功能分解成一个个独...

1232victor
2013/03/27
59
0
WCF 基础简介

例子下载/Files/weichuo/wcfdemo.rar WCF --- Windows Communiction Foundation,是一个Microsoft推出已久的技术。已久有很多人写了不少关于WCF的文章,比如谈谈WCF系列等,都是很好的文章。我...

zting科技
2017/01/12
0
0
WF4.0实战(三):WCF服务

这篇文章,通过一个简单的WCF交互,讲解一下WF4.0中一组重要活动:Messaging,它包括:Receive 、ReceiveAndSendReply、Send、SendAndReceiveReply。这里将详细讲解ReceiveAndSendReply和Sen...

王二狗子11
2018/01/01
0
0
C#进阶系列——DDD领域驱动设计初探(四):WCF搭建

原文:C#进阶系列——DDD领域驱动设计初探(四):WCF搭建 前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储。领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再...

杰克.陈
2017/12/19
0
0
WF4.0实战(十):分布式酒店订房系统

这篇文章主要是实现一个分布式的酒店订房功能。主要阐述如何通过WCF加WF实现一个分布式系统模型。 这个Demo的场景说明: 一家酒店将房间信息存储在SQL Server数据库中,酒店的工作人员根据客...

王二狗子11
2018/01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部