Dela via


Contract-First Tool

Tjänstkontrakt måste ofta skapas från befintliga tjänster. I .NET Framework 4.5 och senare kan datakontraktsklasser skapas automatiskt från befintliga tjänster med hjälp av verktyget contract-first. Om du vill använda verktyget contract-first måste XML-schemadefinitionsfilen (XSD) laddas ned lokalt. verktyget kan inte importera fjärrdatakontrakt via HTTP.

Verktyget contract-first är integrerat i Visual Studio 2012 som en bygguppgift. Kodfilerna som genereras av byggaktiviteten skapas varje gång projektet skapas, så att projektet enkelt kan införa ändringar i det underliggande tjänstkontraktet.

Schematyper som verktyget contract-first kan importera innehåller följande:

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

Enkla typer genereras inte om de är primitiver som Int16 eller String. Komplexa typer genereras inte om de är av typen Collection. Typer genereras inte heller om de ingår i en annan xsd:complexType. I alla dessa fall refereras typerna till befintliga typer i projektet i stället.

Lägga till ett datakontrakt i ett projekt

Innan verktyget contract-first kan användas måste tjänstkontraktet (XSD) läggas till i projektet. I den här översikten används följande kontrakt för att illustrera kontrakt-första funktioner. Den här tjänstdefinitionen är en liten delmängd av tjänstkontraktet som används av Bings sök-API.

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

Om du vill lägga till servicekontraktet ovan i projektet högerklickar du på projektet och väljer Lägg till ny.... Välj Schemadefinition i WCF-fönstret i dialogrutan Mallar och ge den nya filen namnet SampleContract.xsd. Kopiera och klistra in koden ovan i kodvyn för den nya filen.

Konfigurera kontraktsalternativ

Kontraktalternativ kan konfigureras på menyn Egenskaper i ett WCF-projekt. Om du vill aktivera kontrakt-första utveckling markerar du kryssrutan Aktivera XSD som typdefinitionsspråk på WCF-sidan i fönstret projektegenskaper.

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

Om du vill konfigurera avancerade egenskaper klickar du på knappen Avancerat.

Advanced Contract Code Generation Settings dialog box.

Följande avancerade inställningar kan konfigureras för kodgenerering från kontrakt. Inställningar kan bara konfigureras för alla filer i projektet. Inställningar kan inte konfigureras för enskilda filer just nu.

  • Serialiserarläge: Den här inställningen avgör vilken serialiserare som används för att läsa tjänstkontraktsfiler. När XML-serialiserare har valts inaktiveras alternativen Samlingstyper och Återanvändningstyper . De här alternativen gäller endast för datakontraktsserialiseraren.

  • Återanvändningstyper: Den här inställningen anger vilka bibliotek som används för återanvändning av typ. Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • Samlingstyp: Den här inställningen anger den fullständigt kvalificerade eller sammansättningskvalificerade typ som ska användas för insamlingsdatatypen. Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • Ordlistetyp: Den här inställningen anger den fullständigt kvalificerade eller sammansättningskvalificerade typ som ska användas för ordlistedatatypen.

  • EnableDataBinding: Den här inställningen anger om gränssnittet ska implementeras INotifyPropertyChanged på alla datatyper för att implementera databindning.

  • ExcludedTypes:Den här inställningen anger listan över fullständigt kvalificerade eller sammansättningskvalificerade typer som ska undantas från de refererade sammansättningarna. Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • GenerateInternalTypes: Den här inställningen anger om klasser som ska markeras som interna ska genereras. Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • GenerateSerializableTypes: Den här inställningen anger om du vill generera klasser med attributet SerializableAttribute . Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • ImportXMLTypes: Den här inställningen anger om datakontraktsserialiseraren ska konfigureras för att tillämpa SerializableAttribute attributet på klasser utan DataContractAttribute attributet. Den här inställningen gäller endast om Serialiserarläge är inställt på Data Contract Serializer.

  • SupportFx35TypedDataSets: Den här inställningen anger om ytterligare funktioner ska tillhandahållas för typerade datauppsättningar som skapats för .NET Framework 3.5. När Serialiserarläge är inställt på XML-serialiserare TypedDataSetSchemaImporterExtensionFx35läggs tillägget till i XML-schemaimportören när det här värdet är inställt på Sant. När Serialiserarläge är inställt på Data Contract Serializer undantas typen DateTimeOffset från referenserna när det här värdet är inställt på False, så att en DateTimeOffset alltid genereras för äldre ramverksversioner.

  • InputXsdFiles: Den här inställningen anger listan över indatafiler. Varje fil måste innehålla ett giltigt XML-schema.

  • Språk: Den här inställningen anger språket för den genererade kontraktskoden. Inställningen måste vara igenkännlig av CodeDomProvider.

  • NamespaceMappings: Den här inställningen anger mappningarna från XSD-målnamnrymderna till CLR-namnområden. Varje mappning bör använda följande format:

    "Schema Namespace, CLR Namespace"
    

    XML-serialiseraren accepterar endast en mappning i följande format:

    "*, CLR Namespace"
    
  • OutputDirectory: Den här inställningen anger den katalog där kodfilerna ska genereras.

Inställningarna används för att generera tjänstkontraktstyper från tjänstkontraktsfilerna när projektet skapas.

Använda kontrakt-första utveckling

När du har lagt till tjänstkontraktet i projektet och bekräftat bygginställningarna skapar du projektet genom att trycka på F6. De typer som definierats i tjänstkontraktet kommer sedan att vara tillgängliga för användning i projektet.

Om du vill använda de typer som definierats i tjänstkontraktet lägger du till ContractTypes en referens till under det aktuella namnområdet:

using MyProjectNamespace.ContractTypes;

De typer som definieras i tjänstkontraktet kan sedan matchas i projektet enligt nedan:

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

De typer som genereras av verktyget skapas i filen GeneratedXSDTypes.cs. Filen skapas som standard i <katalogen project directory>/obj/<build>/XSDGeneratedCode/. Exempelschemat i början av den här artikeln konverteras på följande sätt:

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

Fel och varningar

Fel och varningar som påträffas vid parsning av XSD-schemat visas som byggfel och varningar.

Gränssnittsarv

Det är inte möjligt att använda gränssnittsarv med kontrakt-första utveckling; Detta överensstämmer med hur gränssnitt fungerar i andra åtgärder. Om du vill använda ett gränssnitt som ärver ett basgränssnitt använder du två separata slutpunkter. Den första slutpunkten använder det ärvda kontraktet och den andra slutpunkten implementerar basgränssnittet.