当前位置: 首页 > news >正文

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

谈谈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:

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一样,也依然可以有多种选择:

转载于:https://www.cnblogs.com/powerzhang/p/3202180.html

相关文章:

  • js判断空值
  • poj2311
  • 一张图读懂数据库备份
  • WPF/ArcGIS Engine三维开发和EVC3/4升级到VS项目建议(转)
  • mysql一直使用swap,导致swap空间用尽变卡
  • 非阻塞同步机制与CAS操作
  • 今天作为一个Android开发者,你迷茫了吗?
  • html select 和dropdownlist小结收集
  • Promise的使用及简单实现
  • Redis详解篇
  • 求int最大值以及int二进制
  • idea+tomcat 解决 debug超级慢 问题
  • ubuntu 安装时分辨率太小 导致无法继续安装
  • EntityFramework Core笔记:查询数据(3)
  • Entity Framework In Action--5 Domain model mapping(2)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Apache Pulsar 2.1 重磅发布
  • css布局,左右固定中间自适应实现
  • Git学习与使用心得(1)—— 初始化
  • JavaScript HTML DOM
  • JAVA多线程机制解析-volatilesynchronized
  • js操作时间(持续更新)
  • PHP那些事儿
  • Python 基础起步 (十) 什么叫函数?
  • Spark RDD学习: aggregate函数
  • SQL 难点解决:记录的引用
  • vue-router的history模式发布配置
  • Vue小说阅读器(仿追书神器)
  • 删除表内多余的重复数据
  • 算法之不定期更新(一)(2018-04-12)
  • 通过git安装npm私有模块
  • 小程序测试方案初探
  • #### go map 底层结构 ####
  • #Linux(Source Insight安装及工程建立)
  • #NOIP 2014# day.1 T2 联合权值
  • (1)STL算法之遍历容器
  • (Python第六天)文件处理
  • (笔试题)合法字符串
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)Linux+Windows下安装ffmpeg
  • (转)memcache、redis缓存
  • (转)大型网站架构演变和知识体系
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Micro Framework初体验(二)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 使用ajax控件后如何调用前端脚本
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net项目IIS、VS 附加进程调试
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择