Aracılığıyla paylaş


Önce Anlaşma Aracı

Hizmet sözleşmelerinin genellikle mevcut hizmetlerden oluşturulması gerekir. .NET Framework 4.5 ve sonraki sürümlerde veri sözleşmesi sınıfları, sözleşme öncelikli araç kullanılarak mevcut hizmetlerden otomatik olarak oluşturulabilir. Sözleşme öncelikli aracı kullanmak için XML şema tanım dosyasının (XSD) yerel olarak indirilmesi gerekir; araç, HTTP aracılığıyla uzak veri sözleşmelerini içeri aktaramaz.

Sözleşme öncelikli araç, derleme görevi olarak Visual Studio 2012 ile tümleşiktir. Derleme görevi tarafından oluşturulan kod dosyaları, proje her oluşturulduğunda oluşturulur, böylece proje temel alınan hizmet sözleşmesindeki değişiklikleri kolayca benimseyebilir.

Sözleşme öncelikli aracın içeri aktarabileceği şema türleri şunlardır:

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

veya Stringgibi Int16 ilkel türlerse basit türler oluşturulmaz; türündeyse Collectionkarmaşık türler oluşturulmaz. Türler başka bir xsd:complexTypeöğesinin parçasıysa da oluşturulmaz. Tüm bu durumlarda, türler bunun yerine projedeki mevcut türlere başvurulacaktır.

Projeye veri sözleşmesi ekleme

Sözleşme öncelikli aracın kullanılabilmesi için önce hizmet sözleşmesinin (XSD) projeye eklenmesi gerekir. Bu genel bakışın amaçları doğrultusunda, sözleşme öncelikli işlevleri göstermek için aşağıdaki sözleşme kullanılacaktır. Bu hizmet tanımı, Bing'in arama API'sinin kullandığı hizmet sözleşmesinin küçük bir alt kümesidir.

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

Yukarıdaki hizmet sözleşmesini projeye eklemek için projeye sağ tıklayın ve Yeni Ekle...'yi seçin. Şablonlar iletişim kutusunun WCF bölmesinden Şema Tanımı'nı seçin ve yeni dosyayı SampleContract.xsd olarak adlandırın. Yukarıdaki kodu kopyalayıp yeni dosyanın kod görünümüne yapıştırın.

Sözleşme öncelikli seçenekleri yapılandırma

Sözleşme öncelikli seçenekler, WCF projesinin Özellikler menüsünde yapılandırılabilir. Sözleşme öncelikli geliştirmeyi etkinleştirmek için proje özellikleri penceresinin WCF sayfasında XSD'yi Tür Tanımı Dili Olarak Etkinleştir onay kutusunu seçin.

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

Gelişmiş özellikleri yapılandırmak için Gelişmiş düğmesine tıklayın.

Advanced Contract Code Generation Settings dialog box.

Aşağıdaki gelişmiş ayarlar, sözleşmelerden kod oluşturma için yapılandırılabilir. Ayarlar yalnızca projedeki tüm dosyalar için yapılandırılabilir; ayarlar şu anda tek tek dosyalar için yapılandırılamaz.

  • Seri Hale Getirici Modu: Bu ayar, hizmet sözleşmesi dosyalarını okumak için hangi seri hale getiricinin kullanıldığını belirler. XML Seri Hale Getirici seçildiğinde, Koleksiyon Türleri ve Yeniden Kullanma Türleri seçenekleri devre dışı bırakılır. Bu seçenekler yalnızca Veri Sözleşmesi Seri Hale Getiricisi için geçerlidir.

  • Türleri Yeniden Kullan: Bu ayar, türü yeniden kullanmak için hangi kitaplıkların kullanılacağını belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • Koleksiyon Türü: Bu ayar, koleksiyon veri türü için kullanılacak tam veya derlemeye uygun türü belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • Sözlük Türü: Bu ayar, sözlük veri türü için kullanılacak tam veya derleme nitelikli türü belirtir.

  • EnableDataBinding: Bu ayar, veri bağlamayı uygulamak için arabirimin INotifyPropertyChanged tüm veri türlerinde uygulanıp uygulanmayacağını belirtir.

  • ExcludedTypes:Bu ayar, başvuruda bulunılan derlemelerin dışında tutulacak tam veya derlemeye uygun türlerin listesini belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • GenerateInternalTypes: Bu ayar, iç olarak işaretlenmiş sınıfların oluşturulup oluşturulmayacağını belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • GenerateSerializableTypes: Bu ayar, özniteliğine sahip sınıfların SerializableAttribute oluşturulup oluşturulmayacağını belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • ImportXMLTypes: Bu ayar, özniteliği özniteliği olmayan sınıflara uygulamak için veri sözleşmesi seri hale getiricisinin SerializableAttribute yapılandırılıp yapılandırılmayacağını DataContractAttribute belirtir. Bu ayar yalnızca Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandıysa geçerlidir.

  • SupportFx35TypedDataSets: Bu ayar, .NET Framework 3.5 için oluşturulan türemiş veri kümeleri için ek işlevsellik sağlanıp sağlanmayacağını belirtir. Seri Hale Getirici Modu XML Seri Hale Getirici olarak ayarlandığında, TypedDataSetSchemaImporterExtensionFx35 bu değer True olarak ayarlandığında uzantı XML şema içeri aktarıcısına eklenir. Seri Hale Getirici Modu Veri Sözleşmesi Seri Hale Getiricisi olarak ayarlandığında, bu değer False olarak ayarlandığında tür DateTimeOffset Başvurular'ın dışında tutulur, böylece eski çerçeve sürümleri için her zaman bir DateTimeOffset oluşturulur.

  • InputXsdFiles: Bu ayar giriş dosyalarının listesini belirtir. Her dosya geçerli bir XML şeması içermelidir.

  • Dil: Bu ayar, oluşturulan sözleşme kodunun dilini belirtir. Ayarın tarafından CodeDomProvidertanınabilir olması gerekir.

  • NamespaceMappings: Bu ayar, XSD Hedef Ad Alanları'ndan CLR ad alanlarına eşlemeleri belirtir. Her eşleme aşağıdaki biçimi kullanmalıdır:

    "Schema Namespace, CLR Namespace"
    

    XML Seri Hale Getiricisi aşağıdaki biçimde yalnızca bir eşlemeyi kabul eder:

    "*, CLR Namespace"
    
  • OutputDirectory: Bu ayar, kod dosyalarının oluşturulacağı dizini belirtir.

Ayarlar, proje oluşturulduğunda hizmet sözleşmesi dosyalarından hizmet sözleşmesi türleri oluşturmak için kullanılır.

Sözleşme öncelikli geliştirmeyi kullanma

Hizmet sözleşmesini projeye ekledikten ve derleme ayarlarını onayladıktan sonra F6 tuşuna basarak projeyi derleyin. Daha sonra hizmet sözleşmesinde tanımlanan türler projede kullanılabilir duruma gelecek.

Hizmet sözleşmesinde tanımlanan türleri kullanmak için ContractTypes geçerli ad alanının altına bir başvuru ekleyin:

using MyProjectNamespace.ContractTypes;

Hizmet sözleşmesinde tanımlanan türler aşağıda gösterildiği gibi projede çözümlenebilir:

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

Araç tarafından oluşturulan türler GeneratedXSDTypes.cs dosyasında oluşturulur. Dosya varsayılan olarak proje dizininde<>/obj/<build configuration>/XSDGeneratedCode/ dizininde oluşturulur. Bu makalenin başındaki örnek şema aşağıdaki gibi dönüştürülür:

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

Hatalar ve uyarılar

XSD şeması ayrıştırılırken karşılaşılan hatalar ve uyarılar derleme hataları ve uyarıları olarak görünür.

Arabirim Devralma

Arabirim devralmayı sözleşme öncelikli geliştirme ile kullanmak mümkün değildir; bu, arabirimlerin diğer işlemlerde davranış biçimiyle tutarlıdır. Temel arabirimi devralan bir arabirim kullanmak için iki ayrı uç nokta kullanın. İlk uç nokta devralınan sözleşmeyi, ikinci uç nokta ise temel arabirimi uygular.