Szerződés-első eszköz
A szolgáltatási szerződéseket gyakran meglévő szolgáltatásokból kell létrehozni. A .NET-keretrendszer 4.5-ös és újabb verzióiban az adatszerződési osztályok automatikusan létrehozhatók a meglévő szolgáltatásokból a szerződés első eszközével. A szerződés első eszközének használatához az XML-sémadefiníciós fájlt (XSD) helyileg kell letölteni; az eszköz nem tudja HTTP-en keresztül importálni a távoli adatszerződéseket.
A szerződés-első eszköz buildelési feladatként integrálva van a Visual Studio 2012-be. A buildelési tevékenység által létrehozott kódfájlok a projekt minden létrehozásakor létrejönnek, hogy a projekt könnyen módosításokat fogadjon el a mögöttes szolgáltatási szerződésben.
A szerződés-első eszköz által importálható sématípusok a következők:
<xsd:complexType>
<xsd:simpleType>
</xsd:simpleType>
</xsd:complexType>
Az egyszerű típusok nem jönnek létre, ha primitívek, például Int16
vagy String
; összetett típusok nem jönnek létre, ha ilyenek Collection
. A típusok akkor sem jönnek létre, ha egy másikhoz xsd:complexType
tartoznak. Ezekben az esetekben a rendszer ehelyett a projekt meglévő típusaira hivatkozik.
Adatszerződés hozzáadása projekthez
A szerződés első eszközének használatához hozzá kell adni a szolgáltatási szerződést (XSD) a projekthez. Ennek az áttekintésnek az alkalmazásában a következő szerződés szolgál a szerződés-első függvények szemléltetésére. Ez a szolgáltatásdefiníció a Bing keresési API által használt szolgáltatási szerződés kis része.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ServiceSchema"
targetNamespace="http://tempuri.org/ServiceSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/ServiceSchema.xsd"
xmlns:mstns="http://tempuri.org/ServiceSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="SearchRequest">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Version" type="xs:string" default="2.2" />
<xs:element minOccurs="0" maxOccurs="1" name="Market" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="UILanguage" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="Query" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="AppId" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Latitude" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Longitude" type="xs:double" />
<xs:element minOccurs="0" maxOccurs="1" name="Radius" type="xs:double" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="WebSearchOption">
<xs:restriction base="xs:string">
<xs:enumeration value="DisableHostCollapsing" />
<xs:enumeration value="DisableQueryAlterations" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
A fenti szolgáltatási szerződés projekthez való hozzáadásához kattintson a jobb gombbal a projektre, és válassza az Új hozzáadása... lehetőséget. A Sablonok párbeszédpanel WCF panelén válassza a Sémadefiníció lehetőséget, és nevezze el az új sampleContract.xsd fájlt. Másolja és illessze be a fenti kódot az új fájl kódnézetébe.
Szerződés-első beállítások konfigurálása
A szerződés-első beállítások konfigurálhatók egy WCF-projekt Tulajdonságok menüjében. A szerződés-első fejlesztés engedélyezéséhez jelölje be az XSD típusdefiníciós nyelvként való engedélyezését a projekttulajdonságok ablak WCF lapján.
A speciális tulajdonságok konfigurálásához kattintson a Speciális gombra.
A következő speciális beállítások konfigurálhatók a szerződésekből származó kódgeneráláshoz. Gépház csak a projekt összes fájljára konfigurálható; az egyes fájlok beállításai jelenleg nem konfigurálhatók.
Szerializáló mód: Ez a beállítás határozza meg, hogy melyik szerializálót használja a szolgáltatásszerződés fájljainak olvasásához. Ha az XML Szerializáló van kiválasztva, a gyűjteménytípusok és az újrafelhasználási típusok beállításai le lesznek tiltva. Ezek a beállítások csak az Adatszerződés szerializálóra vonatkoznak.
Újrahasználati típusok: Ez a beállítás határozza meg, hogy mely kódtárakat használja a rendszer a típus újrafelhasználásához. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
Gyűjtemény típusa: Ez a beállítás a gyűjtemény adattípusához használandó teljes vagy szerelvény-minősített típust adja meg. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
Szótártípus: Ez a beállítás a szótár adattípusához használandó teljes vagy szerelvény-minősített típust adja meg.
EnableDataBinding: Ez a beállítás azt határozza meg, hogy az interfészt minden INotifyPropertyChanged adattípuson implementálni kell-e az adatkötés implementálásához.
ExcludedTypes:Ez a beállítás azoknak a teljes vagy szerelvény-minősített típusoknak a listáját adja meg, amelyeket ki kell zárni a hivatkozott szerelvényekből. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
GenerateInternalTypes: Ez a beállítás határozza meg, hogy belsőként megjelölt osztályokat hozzon-e létre. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
GenerateSerializableTypes: Ez a beállítás határozza meg, hogy létre kell-e hozni az attribútummal rendelkező SerializableAttribute osztályokat. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
ImportXMLTypes: Ez a beállítás azt határozza meg, hogy konfigurálja-e az adatszerződés szerializálót, hogy az attribútumot az SerializableAttributeDataContractAttribute attribútum nélküli osztályokra alkalmazza. Ez a beállítás csak akkor érvényes, ha a Szerializáló mód adatszerződéses szerializálóra van állítva.
SupportFx35TypedDataSets: Ez a beállítás azt határozza meg, hogy a .NET-keretrendszer 3.5-höz létrehozott gépelt adatkészletekhez biztosít-e további funkciókat. Ha a Szerializáló mód XML-szerializálóra van állítva, a TypedDataSetSchemaImporterExtensionFx35 bővítmény akkor lesz hozzáadva az XML-sémaimportálóhoz, ha ez az érték Igaz értékre van állítva. Ha a Szerializáló mód adatszerződéses szerializálóra van állítva, a rendszer kizárja a típust DateTimeOffset a Hivatkozásokból, ha ez az érték Hamis értékre van állítva, így DateTimeOffset a rendszer mindig a régebbi keretrendszerverziókhoz jön létre.
InputXsdFiles: Ez a beállítás határozza meg a bemeneti fájlok listáját. Minden fájlnak érvényes XML-sémát kell tartalmaznia.
Nyelv: Ez a beállítás a létrehozott szerződéskód nyelvét határozza meg. A beállításnak felismerhetőnek kell lennie.CodeDomProvider
NamespaceMappings: Ez a beállítás az XSD-célnévterekről a CLR-névterekre való leképezéseket adja meg. Minden leképezésnek a következő formátumot kell használnia:
"Schema Namespace, CLR Namespace"
Az XML Szerializáló csak egy leképezést fogad el a következő formátumban:
"*, CLR Namespace"
OutputDirectory: Ez a beállítás azt a könyvtárat adja meg, amelyben a kódfájlok létre lesznek hozva.
A beállítások segítségével a rendszer szolgáltatásszerződés-típusokat hoz létre a szolgáltatásszerződés-fájlokból a projekt létrehozásakor.
Szerződés-első fejlesztés használata
Miután hozzáadta a szolgáltatási szerződést a projekthez, és megerősítette a buildelési beállításokat, hozza létre a projektet az F6 billentyű lenyomásával. A szolgáltatási szerződésben meghatározott típusok ezután elérhetők lesznek a projektben.
A szolgáltatási szerződésben meghatározott típusok használatához adjon hozzá egy hivatkozást ContractTypes
az aktuális névtérhez:
using MyProjectNamespace.ContractTypes;
A szolgáltatási szerződésben meghatározott típusok feloldhatók lesznek a projektben az alábbiak szerint:
Az eszköz által létrehozott típusok a GeneratedXSDTypes.cs fájlban jönnek létre. A fájl alapértelmezés szerint a <projektkönyvtárban>/obj/<buildkonfigurációban>/XSDGeneratedCode/könyvtárban jön létre. A cikk elején található mintaséma a következőképpen lesz konvertálva:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.17330
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TestXSD3.ContractTypes
{
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17330")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd", IsNullable=true)]
public partial class SearchRequest
{
private string versionField;
private string marketField;
private string uILanguageField;
private string queryField;
private string appIdField;
private double latitudeField;
private bool latitudeFieldSpecified;
private double longitudeField;
private bool longitudeFieldSpecified;
private double radiusField;
private bool radiusFieldSpecified;
public SearchRequest()
{
this.versionField = "2.2";
}
/// <remarks/>
[System.ComponentModel.DefaultValueAttribute("2.2")]
public string Version
{
get
{
return this.versionField;
}
set
{
this.versionField = value;
}
}
/// <remarks/>
public string Market
{
get
{
return this.marketField;
}
set
{
this.marketField = value;
}
}
/// <remarks/>
public string UILanguage
{
get
{
return this.uILanguageField;
}
set
{
this.uILanguageField = value;
}
}
/// <remarks/>
public string Query
{
get
{
return this.queryField;
}
set
{
this.queryField = value;
}
}
/// <remarks/>
public string AppId
{
get
{
return this.appIdField;
}
set
{
this.appIdField = value;
}
}
/// <remarks/>
public double Latitude
{
get
{
return this.latitudeField;
}
set
{
this.latitudeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LatitudeSpecified
{
get
{
return this.latitudeFieldSpecified;
}
set
{
this.latitudeFieldSpecified = value;
}
}
/// <remarks/>
public double Longitude
{
get
{
return this.longitudeField;
}
set
{
this.longitudeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool LongitudeSpecified
{
get
{
return this.longitudeFieldSpecified;
}
set
{
this.longitudeFieldSpecified = value;
}
}
/// <remarks/>
public double Radius
{
get
{
return this.radiusField;
}
set
{
this.radiusField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool RadiusSpecified
{
get
{
return this.radiusFieldSpecified;
}
set
{
this.radiusFieldSpecified = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17330")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/ServiceSchema.xsd", IsNullable=false)]
public enum WebSearchOption
{
/// <remarks/>
DisableHostCollapsing,
/// <remarks/>
DisableQueryAlterations,
}
}
Hibák és figyelmeztetések
Az XSD-séma elemzésével kapcsolatos hibák és figyelmeztetések buildelési hibákként és figyelmeztetésként jelennek meg.
Interfész öröklése
Az interfészöröklés nem használható szerződés-első fejlesztéssel; ez összhangban van azzal, ahogyan az interfészek más műveletekben viselkednek. Az alapfelületet öröklő felület használatához használjon két különálló végpontot. Az első végpont az örökölt szerződést használja, a második végpont pedig az alapfelületet implementálja.