Bagikan melalui


Alat Contract-First

Kontrak layanan sering kali perlu dibuat dari layanan yang ada. Di .NET Framework 4.5 dan versi yang lebih baru, kelas kontrak data dapat dibuat secara otomatis dari layanan yang ada menggunakan alat kontrak-pertama. Untuk menggunakan alat kontrak-pertama, file definisi skema XML (XSD) harus diunduh secara lokal; alat tidak dapat mengimpor kontrak data jarak jauh melalui HTTP.

Alat contract-first diintegrasikan ke dalam Visual Studio 2012 sebagai langkah build. File kode yang dihasilkan oleh tugas build dibuat setiap kali proyek dibangun, sehingga proyek dapat dengan mudah mengadopsi perubahan dalam kontrak layanan yang mendasar.

Jenis skema yang dapat diimpor oleh alat yang berfokus pada kontrak mencakup yang berikut ini:

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

Jenis sederhana tidak akan dihasilkan jika mereka primitif seperti Int16 atau String; jenis kompleks tidak akan dihasilkan jika mereka berjenis Collection. Jenis juga tidak akan dihasilkan jika merupakan bagian dari yang lain xsd:complexType. Dalam semua kasus ini, jenis akan dirujuk ke jenis yang ada dalam proyek sebagai gantinya.

Menambahkan kontrak data ke proyek

Sebelum alat kontrak-pertama dapat digunakan, kontrak layanan (XSD) harus ditambahkan ke proyek. Untuk tujuan gambaran umum ini, kontrak berikut akan digunakan untuk mengilustrasikan fungsi kontrak-pertama. Definisi layanan ini adalah subset kecil dari kontrak layanan yang digunakan oleh API pencarian Bing.

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

Untuk menambahkan kontrak layanan di atas ke proyek, klik kanan proyek dan pilih Tambahkan Baru.... Pilih Definisi Skema dari panel WCF dialog Templat, dan beri nama file baru SampleContract.xsd. Salin dan tempel kode di atas ke dalam tampilan kode file baru.

Konfigurasi opsi berdasarkan kontrak terlebih dahulu

Opsi kontrak-pertama dapat dikonfigurasi di menu Properti pada proyek WCF. Untuk mengaktifkan pengembangan pertama kontrak, pilih kotak centang Aktifkan XSD sebagai Bahasa Definisi Tipe di halaman WCF jendela properti proyek.

Cuplikan layar Opsi WCF dengan pengembangan dengan kontrak sebagai prioritas diaktifkan.

Untuk mengonfigurasi properti tingkat lanjut, klik tombol Tingkat Lanjut.

Kotak dialog Pengaturan Pembuatan Kode Kontrak Tingkat Lanjut.

Pengaturan lanjutan berikut dapat dikonfigurasi untuk pembuatan kode dari kontrak. Pengaturan hanya dapat dikonfigurasi untuk semua file dalam proyek; pengaturan tidak dapat dikonfigurasi untuk masing-masing berkas saat ini.

  • Mode Serializer: Pengaturan ini menentukan serializer mana yang digunakan untuk membaca file kontrak layanan. Saat Serializer XML dipilih, opsi Jenis Koleksi dan Jenis Penggunaan Kembali dinonaktifkan. Opsi ini hanya berlaku untuk Serializer Kontrak Data.

  • Penggunaan Ulang Tipe: Pengaturan ini menentukan pustaka mana yang digunakan untuk penggunaan ulang tipe. Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • Jenis Koleksi: Pengaturan ini menentukan tipe yang memenuhi syarat sepenuhnya atau memenuhi syarat rakitan yang akan digunakan untuk tipe data koleksi. Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • Jenis Kamus: Pengaturan ini menentukan jenis yang berkualifikasi penuh atau berkualifikasi perakitan untuk digunakan sebagai tipe data kamus.

  • EnableDataBinding: Pengaturan ini menentukan apakah akan menerapkan INotifyPropertyChanged antarmuka pada semua jenis data untuk menerapkan pengikatan data.

  • ExcludedTypes:Pengaturan ini menentukan daftar tipe yang memenuhi syarat sepenuhnya atau tipe memenuhi syarat rakitan untuk dikecualikan dari rakitan yang dirujuk. Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • GenerateInternalTypes: Pengaturan ini menentukan apakah akan menghasilkan kelas yang ditandai sebagai internal. Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • GenerateSerializableTypes: Pengaturan ini menentukan apakah akan menghasilkan kelas dengan SerializableAttribute atribut . Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • ImportXMLTypes: Pengaturan ini menentukan apakah akan mengonfigurasi serializer kontrak data untuk menerapkan atribut SerializableAttribute pada kelas yang tidak memiliki atribut DataContractAttribute. Pengaturan ini hanya berlaku jika Mode Serializer diatur ke Serializer Kontrak Data.

  • SupportFx35TypedDataSets: Pengaturan ini menentukan apakah akan menyediakan fungsionalitas tambahan untuk himpunan data yang ditik yang dibuat untuk .NET Framework 3.5. Ketika Mode Serializer diatur ke XML Serializer, TypedDataSetSchemaImporterExtensionFx35 ekstensi akan ditambahkan ke pengimpor skema XML saat nilai ini diatur ke True. Ketika Mode Serializer diatur ke Serializer Kontrak Data, tipe DateTimeOffset akan dikecualikan dari Referensi ketika nilai ini diatur ke False, sehingga DateTimeOffset selalu dihasilkan untuk versi kerangka kerja yang lebih lama.

  • InputXsdFiles: Pengaturan ini menentukan daftar file input. Setiap file harus berisi skema XML yang valid.

  • Bahasa: Pengaturan ini menentukan bahasa kode kontrak yang dihasilkan. Pengaturan harus dapat dikenali oleh CodeDomProvider.

  • NamespaceMappings: Pengaturan ini menentukan pemetaan dari Namespace Target XSD ke namespace CLR. Setiap pemetaan harus menggunakan format berikut:

    "Schema Namespace, CLR Namespace"
    

    Serializer XML hanya menerima satu pemetaan dalam format berikut:

    "*, CLR Namespace"
    
  • OutputDirectory: Pengaturan ini menentukan direktori tempat file kode akan dibuat.

Pengaturan akan digunakan untuk menghasilkan jenis kontrak layanan dari file kontrak layanan saat proyek dibangun.

Menggunakan pengembangan berbasis kontrak-pertama

Setelah menambahkan kontrak layanan ke proyek dan mengonfirmasi pengaturan build, buat proyek dengan menekan F6. Jenis yang ditentukan dalam kontrak layanan kemudian akan tersedia untuk digunakan dalam proyek.

Untuk menggunakan jenis yang ditentukan dalam kontrak layanan, tambahkan referensi ke ContractTypes di bawah namespace saat ini:

using MyProjectNamespace.ContractTypes;

Jenis yang ditentukan dalam kontrak layanan kemudian akan dapat diselesaikan dalam proyek, seperti yang ditunjukkan di bawah ini:

Kelas SearchRequest ditampilkan di IntelliSense setelah mengetik beberapa huruf pertama.

Jenis yang dihasilkan oleh alat dibuat dalam file GeneratedXSDTypes.cs. File dibuat di <direktori> proyek/obj/<build configuration>/XSDGeneratedCode/ direktori secara default. Skema sampel di awal artikel ini dikonversi sebagai berikut:

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

Kesalahan dan peringatan

Kesalahan dan peringatan yang ditemui dalam mengurai skema XSD akan muncul sebagai kesalahan dan peringatan build.

Pewarisan Antarmuka

Penggunaan pewarisan antarmuka tidak memungkinkan dalam pengembangan berorientasi kontrak terlebih dahulu; ini konsisten dengan cara antarmuka berperilaku dalam operasi lain. Untuk menggunakan antarmuka yang mewarisi antarmuka dasar, gunakan dua titik akhir terpisah. Titik akhir pertama menggunakan kontrak yang diwariskan, dan titik akhir kedua mengimplementasikan antarmuka dasar.