Freigeben über


Vertrag zuerst-Tool

Serviceverträge müssen häufig aus vorhandenen Diensten erstellt werden. In .NET Framework 4.5 und höher können Datenvertragsklassen automatisch über vorhandene Dienste mithilfe des Vertrags-first-Tools erstellt werden. Um das Contract-First-Tool zu verwenden, muss die XML-Schemadefinitionsdatei (XSD) lokal heruntergeladen werden; das Tool kann Remote-Datenkontrakte nicht über HTTP importieren.

Das Contract-First-Tool ist als Buildaufgabe in Visual Studio 2012 integriert. Die vom Buildvorgang generierten Codedateien werden jedes Mal erstellt, wenn das Projekt erstellt wird, sodass das Projekt problemlos Änderungen im zugrunde liegenden Dienstvertrag übernehmen kann.

Schematypen, die vom Contract-first-Tool importiert werden können, umfassen Folgendes:

<xsd:complexType>
 <xsd:simpleType>
 </xsd:simpleType>
</xsd:complexType>

Einfache Typen werden nicht generiert, wenn sie Grundtypen wie Int16 oder String; komplexe Typen werden nicht generiert, wenn sie vom Typ Collectionsind. Typen werden auch nicht generiert, wenn sie Teil eines anderen xsd:complexTypesind. In allen diesen Fällen werden stattdessen Verweise dieser Typen auf im Projekt vorhandene Typen verwendet.

Hinzufügen eines Datenvertrags zu einem Projekt

Bevor das Contract-First-Tool verwendet werden kann, muss der Dienstvertrag (XSD) dem Projekt hinzugefügt werden. In dieser Übersicht wird zum Veranschaulichen von Vertrag zuerst-Funktionen der folgende Vertrag verwendet. Diese Dienstdefinition ist eine kleine Teilmenge des Dienstvertrags, der von der Such-API von Bing verwendet wird.

<?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>

Wenn Sie dem Projekt den obigen Servicevertrag hinzufügen möchten, klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie "Neu hinzufügen" aus. Wählen Sie im WCF-Bereich des Dialogfelds "Vorlagen" die Schemadefinition aus, und nennen Sie die neue Datei "SampleContract.xsd". Kopieren Sie den obigen Code, und fügen Sie ihn in die Codeansicht der neuen Datei ein.

Konfigurieren von Vertrag zuerst-Optionen

Vertragsorientierte Optionen können im Menü "Eigenschaften" eines WCF-Projekts konfiguriert werden. Zur Nutzung der Contract-First-Entwicklung aktivieren Sie auf der WCF-Seite des Projekteigenschaftenfensters das Kontrollkästchen XSD als Typdefinitionssprache aktivieren.

Screenshot der WCF-Optionen mit aktivierter Contract-First-Entwicklung.

Um erweiterte Eigenschaften zu konfigurieren, klicken Sie auf die Schaltfläche "Erweitert".

Dialogfeld

Die folgenden erweiterten Einstellungen können für die Codegenerierung aus Verträgen konfiguriert werden. Einstellungen können nur für alle Dateien im Projekt konfiguriert werden; Einstellungen können zurzeit nicht für einzelne Dateien konfiguriert werden.

  • Serialisierungsmodus: Diese Einstellung bestimmt, welche Serialisierung zum Lesen von Dienstvertragsdateien verwendet wird. Wenn xml Serializer ausgewählt ist, werden die Optionen für Sammlungstypen und Wiederverwendungstypen deaktiviert. Diese Optionen gelten nur für den Data Contract Serializer.

  • Wiederverwenden von Typen: Diese Einstellung gibt an, welche Bibliotheken für die Typwiederverwendung verwendet werden. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • Sammlungstyp: Diese Einstellung gibt den vollqualifizierten oder durch die Assembly qualifizierten Typ an, der für den Sammlungsdatentyp verwendet werden soll. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • Wörterbuchtyp: Diese Einstellung gibt den vollqualifizierten oder assemblyqualifizierten Typ an, der für den Wörterbuchdatentyp verwendet werden soll.

  • EnableDataBinding: Diese Einstellung gibt an, ob die INotifyPropertyChanged Schnittstelle für alle Datentypen implementiert werden soll, um die Datenbindung zu implementieren.

  • ExcludedTypes:Diese Einstellung gibt die Liste der vollqualifizierten oder assemblyqualifizierten Typen an, die von den referenzierten Assemblys ausgeschlossen werden sollen. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • GenerateInternalTypes: Diese Einstellung gibt an, ob Klassen generiert werden sollen, die als intern gekennzeichnet sind. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • GenerateSerializableTypes: Diese Einstellung gibt an, ob Klassen mit dem SerializableAttribute Attribut generiert werden sollen. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • ImportXMLTypes: Diese Einstellung gibt an, ob der Serialisierungsprogramm für den Datenvertrag so konfiguriert werden soll, dass das SerializableAttribute Attribut auf Klassen ohne das DataContractAttribute Attribut angewendet wird. Diese Einstellung gilt nur, wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist.

  • SupportFx35TypedDataSets: Diese Einstellung gibt an, ob zusätzliche Funktionen für typisierte Datensätze bereitgestellt werden sollen, die für .NET Framework 3.5 erstellt wurden. Wenn der Serialisierungsmodus auf XML Serializer festgelegt ist, wird die TypedDataSetSchemaImporterExtensionFx35 Erweiterung dem XML-Schemaimporteur hinzugefügt, wenn dieser Wert auf True festgelegt ist. Wenn der Serialisierungsmodus auf " Serializer für Datenvertrag" festgelegt ist, wird der Typ DateTimeOffset von den Verweisen ausgeschlossen, wenn dieser Wert auf "False" festgelegt ist, sodass für ältere Frameworkversionen immer ein DateTimeOffset Wert generiert wird.

  • InputXsdFiles: Diese Einstellung gibt die Liste der Eingabedateien an. Jede Datei muss ein gültiges XML-Schema enthalten.

  • Sprache: Diese Einstellung gibt die Sprache des generierten Vertragscodes an. Die Einstellung muss erkennbar sein durch CodeDomProvider.

  • NamespaceMappings: Diese Einstellung gibt die Zuordnungen aus den XSD-Zielnamespaces zu CLR-Namespaces an. Jede Zuordnung sollte das folgende Format verwenden:

    "Schema Namespace, CLR Namespace"
    

    Der XML-Serializer akzeptiert nur eine Zuordnung im folgenden Format:

    "*, CLR Namespace"
    
  • OutputDirectory: Diese Einstellung gibt das Verzeichnis an, in dem die Codedateien generiert werden.

Die Einstellungen werden verwendet, um Dienstvertragstypen aus den Dienstvertragsdateien zu generieren, wenn das Projekt erstellt wird.

Verwenden der Vertrag zuerst-Entwicklung

Nachdem Sie den Dienstvertrag zum Projekt hinzugefügt und die Buildeinstellungen bestätigt haben, erstellen Sie das Projekt, indem Sie F6 drücken. Die im Dienstvertrag definierten Typen stehen dann für die Verwendung im Projekt zur Verfügung.

Um die im Dienstvertrag definierten Typen zu verwenden, fügen Sie unter dem aktuellen Namespace einen Verweis hinzu ContractTypes :

using MyProjectNamespace.ContractTypes;

Die im Servicevertrag definierten Typen können dann im Projekt aufgelöst werden, wie unten dargestellt:

SearchRequest-Klasse, die in IntelliSense nach der Eingabe der ersten Buchstaben angezeigt wird.

Die vom Tool generierten Typen werden in der datei GeneratedXSDTypes.cs erstellt. Die Datei wird standardmäßig im <Projektverzeichnis>/obj/<build configuration>/XSDGeneratedCode/Directory erstellt. Das Beispielschema am Anfang dieses Artikels wird wie folgt konvertiert:

//------------------------------------------------------------------------------
// <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,
    }
}

Fehler und Warnungen

Fehler und Warnungen beim Analysieren des XSD-Schemas werden als Buildfehler und Warnungen angezeigt.

Schnittstellenvererbung

Es ist nicht möglich, Schnittstellenvererbung mit der Contract-First-Entwicklung zu verwenden; dies steht im Einklang mit dem Verhalten von Schnittstellen in anderen Anwendungsbereichen. Um eine Schnittstelle zu verwenden, die eine Basisschnittstelle erbt, verwenden Sie zwei separate Endpunkte. Der erste Endpunkt verwendet den geerbten Vertrag, und der zweite Endpunkt implementiert die Basisschnittstelle.