Megosztás a következőn keresztül:


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:complexTypetartoznak. 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.

Screenshot of the WCF Options with contract-first development enabled.

A speciális tulajdonságok konfigurálásához kattintson a Speciális gombra.

Advanced Contract Code Generation Settings dialog box.

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:

SearchRequest class showing in IntelliSense after typing the first few letters.

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.