技术开发 频道

WCF中的Data Contract:Data Contract Overview


Contract in WCF

   上面我们实际上是在一个厂商中立的前提下探讨Contract,这里的Contract和具体的平台和技术无关。接下来我们要谈的是基于技术的话题:讨论一下WCF下的Contract。简单地说,WCF中的Contract主要的功能就是如何将一个基于.NET的CLR Type,Interface或者Class,转化成一个我们上面提到的Neutral Contract。比如,如果我们在一个Interface和它的成员上分别运用Service Contract Attribute和Operation Contract,当我们Host实现了该Interface的Service的时候,WCF就能将在一个.NET-specific的CLR Type暴露成一个Neutral Service Contract。同理对于一个,我们通过在一个Class和它的成员上分别添加DataContractAttribute和DataMemberAttribute,就可以就该CLR Type转变成Neutral Data Contract。

   比如我们一个运用了DataContractAttribute和DataMemberAttribute的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
{ get; set; }

[DataMember(Order = 2)]
public Guid SupplierID
{ get; set; }
}
}
   就可以转变成另一种厂商中立的、以XSD表示的Neutral Data Contract:
<?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需要调用该Order type的Service的时候,在本地需要一个Data Type能够匹配上面的以XSD体现的Data Contract。一般地,我们可以在VS中通过Add Service Reference的方式或者通过一些Tools,比如XSDUtil和SvcUtil来生成这样的Class。比如我们通过Add Service Reference方式,就可以生成下面一个对应的Order class:

0
相关文章