您的位置:知识库 » .NET技术

[原创]谈谈WCF中的Data Contract (1):Data Contract Overview

作者: Artech  来源: 博客园  发布时间: 2008-08-14 10:03  阅读: 4365 次  推荐: 1   原文链接   [收藏]  
摘要:在我们看来,Service Orientation提供了一种对业务、功能进行分解的方式。
[1] [原创]谈谈WCF中的Data Contract (1):Data Contract Overview
[2] [原创]谈谈WCF中的Data Contract (1):Data Contract Overview
[3] [原创]谈谈WCF中的Data Contract (1):Data Contract Overview

Data Contract Mapping Mechanism 

  通过上面的介绍,我们发现WCF Data Contract就如同一个适配器,弥合了 CLR TypeNeutral Contract的差异,很容易地实现了他们之间的匹配。接下来,我们就以一个实际的例子来介绍WCF DataContract的这种适配功能:通过DataContractAttribute的修饰,实现了将一个现有Data Type向一个既定的Neutral Data Contract进行适配,从而实现了对基于该Neutral Data ContractService 进行正常调用的目的。

  我们就以上面提到的Order Class为例,Service端的Order class最终暴露成一个以XSD表示的Neutral Contract

Order class

namespace Artech.DataContractVersioning.Service
{
    [DataContract(Namespace
="http://artech.datacontractversioning")]
    
public class Order 
    
{
        [DataMember(Order 
= 0)]
        
public Guid OrderID
        
{get;set;}

        [DataMember(Order 
= 1)]
        
public DateTime OrderDate
        
getset; }

        [DataMember(Order 
= 2)]
        
public Guid SupplierID
        
getset; }
    }

}

XSD

 

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" targetNamespace="http://artech.datacontractversioning"
    xmlns:xs
="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://artech.datacontractversioning"
    xmlns:ser
="http://schemas.microsoft.com/2003/10/Serialization/">
<xs:import schemaLocation="http://artech/Artech.DataContractVersioning/OrderManagerService.svc?xsd=xsd1"
    namespace
="http://schemas.microsoft.com/2003/10/Serialization/" />
<xs:complexType name="Order">
    
<xs:sequence>
        
<xs:element minOccurs="0" name="OrderID" type="ser:guid" />
        
<xs:element minOccurs="0" name="OrderDate" type="xs:dateTime" />
        
<xs:element minOccurs="0" name="SupplierID" type="ser:guid" />
    
</xs:sequence>
</xs:complexType><xs:element name="Order" nillable="true" type="tns:Order"/></xs:schema>

设我们在Client有一个与之结构相似的CustomOrder class

public class CustomOrder
    
{
        
public Guid OrderNo
        
getset; }

        
public Guid SupplierNo
        
getset; }

        
public DateTime OrderDate
        
getset; }
}

 

  仔细分析CustomOrderServiceOrder以及XSD,我们发现两者除了结构一样之外,没有一处使相同的,具体体现在:         

  • Class Name不一样。
  • NameSpace不一样,OrderXSDnamespacehttp://artech.datacontractversioning,而CustomOrder却没有显示指定一个Namespace(这样WCF会为其指定一个默认的namespace)。
  • 成员的名称不一样。
  • 成员的顺利不一样。

  如果我们现在要使我们的CustomOrder满足现有的Order Data Contract,我们就需要消除这些不同之处,通过DataContractAttributeDataMemberAttribute,这样的问题根本就不是问题,下面就是我们重新定义的CustomOrder class

 

  [DataContract(Name="Order",Namespace="http://artech.datacontractversioning")]
    
public class CustomOrder
    
{
        [DataMember(Order 
= 0, Name="OrderID")]
        
public Guid OrderNo
        
getset; }

        [DataMember(Order 
= 2, Name = "SupplierID")]
        
public Guid SupplierNo
        
getset; }

        [DataMember(Order 
= 1)]
        
public DateTime OrderDate
        
getset; }

        [DataMember(Order 
= 3)]
        
public string ShippingAddress
        
getset; }
}

 

  通过在DataContractAttribute指定NameNamespace使Data ContractNamespace和既定的Contract相匹配,通过DataMemberAttributeNameOrder参数是成员的名称和次序与既定的Contract相匹配。

1
1
标签:WCF

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻