Bagikan melalui


Pengganti Kontrak Data

Pengganti kontrak data adalah fitur tingkat lanjut yang dibangun di atas model Kontrak Data. Fitur ini dirancang untuk digunakan untuk kustomisasi dan pengganti jenis dalam situasi di mana pengguna ingin mengubah bagaimana jenis diserialisasi, dideserialisasi atau diproyeksikan menjadi metadata. Beberapa skenario di mana pengganti dapat digunakan adalah saat kontrak data belum ditentukan untuk jenis, bidang, dan properti tidak ditandai dengan atribut DataMemberAttribute atau pengguna ingin membuat variasi skema secara dinamis.

Serialisasi dan deserialisasi dilakukan dengan pengganti kontrak data saat menggunakan DataContractSerializer yang akan dikonversi dari .NET Framework ke format yang sesuai, seperti XML. Pengganti kontrak data juga dapat digunakan untuk memodifikasi metadata yang diekspor untuk jenis, saat membuat representasi metadata seperti XML Schema Documents (XSD). Setelah impor, kode dibuat dari metadata dan pengganti juga dapat digunakan dalam hal ini untuk menyesuaikan kode yang dihasilkan.

Cara Kerja Pengganti

Pengganti bekerja dengan memetakan satu jenis (jenis "asli" ) ke jenis lain (jenis "pengganti"). Contoh berikut menunjukkan jenis Inventory asli dan jenis InventorySurrogated pengganti baru. Jenis Inventory tidak dapat diserialisasi tetapi jenis InventorySurrogated adalah:

public class Inventory
{
    public int pencils;
    public int pens;
    public int paper;
}

Karena kontrak data belum ditentukan untuk kelas ini, konversikan kelas menjadi kelas pengganti dengan kontrak data. Kelas pengganti ditunjukkan dalam contoh berikut:

[DataContract(Name = "Inventory")]
public class InventorySurrogated
{
    [DataMember]
    public int numpencils;
    [DataMember]
    public int numpaper;
    [DataMember]
    private int numpens;

    public int pens
    {
        get { return numpens; }
        set { numpens = value; }
    }
}

Menerapkan IDataContractSurrogate

Untuk menggunakan pengganti kontrak data, terapkan antarmuka IDataContractSurrogate.

Berikut ringkasan setiap metode IDataContractSurrogate dengan kemungkinan implementasi.

GetDataContractType

Metode GetDataContractType memetakan satu jenis ke jenis lainnya. Metode ini diperlukan untuk serialisasi, deserialisasi, impor, dan ekspor.

Tugas pertama adalah menentukan jenis yang akan dipetakan ke jenis lain. Misalnya:

public Type GetDataContractType(Type type)
{
    Console.WriteLine("GetDataContractType");
    if (typeof(Inventory).IsAssignableFrom(type))
    {
        return typeof(InventorySurrogated);
    }
    return type;
}
  • Pada serialisasi, pemetaan yang ditampilkan oleh metode ini kemudian digunakan untuk mengubah instans asli menjadi instans pengganti dengan memanggil metode GetObjectToSerialize.

  • Pada deserialisasi, pemetaan yang ditampilkan oleh metode ini digunakan oleh alat serialisasi untuk dideserialisasi menjadi instans jenis pengganti. Ini kemudian memanggil GetDeserializedObject untuk mengubah instans pengganti menjadi instans jenis asli.

  • Saat ekspor, jenis pengganti yang ditampilkan oleh metode ini dicerminkan untuk mendapatkan kontrak data yang akan digunakan untuk menghasilkan metadata.

  • Pada impor, jenis awal diubah menjadi jenis pengganti yang dicerminkan untuk mendapatkan kontrak data yang akan digunakan untuk tujuan seperti referensi dukungan.

Parameter Type adalah jenis objek yang sedang diserialisasi, dideserialisasi, diimpor, atau diekspor. Metode GetDataContractType harus menampilkan jenis input jika pengganti tidak menangani jenis. Jika tidak, jenis pengganti yang sesuai akan ditampilkan. Jika ada beberapa jenis pengganti, banyak pemetaan dapat ditentukan dalam metode ini.

Metode GetDataContractType tidak dipanggil untuk primitif kontrak data bawaan, seperti Int32 atau String. Untuk jenis lain, seperti array, jenis yang ditentukan pengguna, dan struktur data lainnya, metode ini akan dipanggil untuk setiap jenis.

Dalam contoh sebelumnya, metode memeriksa apakah parameter type dan Inventory sebanding. Jika demikian, metode akan memetakannya ke InventorySurrogated. Setiap kali serialisasi, deserialisasi, skema impor, atau skema ekspor dipanggil, fungsi ini dipanggil terlebih dahulu untuk menentukan pemetaan antar jenis.

Metode GetObjectToSerialize

Metode GetObjectToSerialize mengonversi instans jenis asli ke instans jenis pengganti. Metode ini diperlukan untuk serialisasi.

Langkah selanjutnya adalah menentukan cara data fisik dipetakan dari instans asli ke pengganti dengan menerapkan metode GetObjectToSerialize. Misalnya:

public object GetObjectToSerialize(object obj, Type targetType)
{
    Console.WriteLine("GetObjectToSerialize");
    if (obj is Inventory)
    {
        InventorySurrogated isur = new InventorySurrogated();
        isur.numpaper = ((Inventory)obj).paper;
        isur.numpencils = ((Inventory)obj).pencils;
        isur.pens = ((Inventory)obj).pens;
        return isur;
    }
    return obj;
}

Metode GetObjectToSerialize dipanggil saat objek diserialisasi. Metode ini mentransfer data dari jenis asli ke bidang jenis pengganti. Bidang dapat langsung dipetakan ke bidang pengganti, atau manipulasi data asli dapat disimpan di pengganti. Beberapa kemungkinan penggunaan meliputi: langsung memetakan bidang, melakukan operasi pada data yang akan disimpan di bidang pengganti, atau menyimpan XML jenis asli di bidang pengganti.

Parameter targetType adalah jenis anggota yang dinyatakan. Parameter ini adalah jenis pengganti yang ditampilkan oleh metode GetDataContractType. Alat serialisasi tidak memaksa objek yang ditampilkan dapat ditetapkan ke jenis ini. Parameter obj adalah objek yang akan diserialisasi, dan akan dikonversi ke penggantinya jika perlu. Metode ini harus menampilkan objek input jika pengganti tidak menangani objek. Jika tidak, objek pengganti baru akan ditampilkan. Pengganti tidak dipanggil jika objeknya null. Banyak pemetaan pengganti untuk instans yang berbeda dapat ditentukan dalam metode ini.

Saat membuat DataContractSerializer, Anda dapat memintanya mempertahankan referensi objek. (Untuk informasi selengkapnya, lihat Serialisasi dan Deserialisasi.) Ini dilakukan dengan mengatur parameter preserveObjectReferences dalam konstruktornya ke true. Dalam hal ini, pengganti dipanggil hanya sekali untuk objek karena semua serialisasi berikutnya hanya menulis referensi ke dalam aliran. Jika preserveObjectReferences diatur ke false, pengganti akan dipanggil setiap kali instans ditemui.

Jika jenis instans yang diserialisasi berbeda dengan jenis yang dinyatakan, informasi jenis akan ditulis ke dalam aliran, misalnya, xsi:type untuk memungkinkan instans dideserialisasi di ujung lain. Proses ini terjadi terlepas dari objek tersebut pengganti atau tidak.

Contoh di atas mengonversi data instans Inventory menjadi InventorySurrogated. Ini memeriksa jenis objek dan melakukan manipulasi yang diperlukan untuk mengonversi ke jenis pengganti. Dalam hal ini, bidang kelas Inventory langsung disalin ke bidang kelas InventorySurrogated.

Metode GetDeserializedObject

Metode GetDeserializedObject mengonversi instans jenis pengganti ke instans jenis asli. Diperlukan untuk deserialisasi.

Tugas selanjutnya adalah menentukan cara data fisik dipetakan dari instans pengganti ke instans asli. Misalnya:

public object GetDeserializedObject(object obj, Type targetType)
{
    Console.WriteLine("GetDeserializedObject");
    if (obj is InventorySurrogated)
    {
        Inventory invent = new Inventory();
        invent.pens = ((InventorySurrogated)obj).pens;
        invent.pencils = ((InventorySurrogated)obj).numpencils;
        invent.paper = ((InventorySurrogated)obj).numpaper;
        return invent;
    }
    return obj;
}

Metode ini hanya disebut selama deserialisasi objek. Ini menyediakan pemetaan data terbalik untuk deserialisasi dari jenis pengganti kembali ke jenis aslinya. Seperti halnya metode GetObjectToSerialize, beberapa kemungkinan penggunaan mungkin bertukar data bidang secara langsung, melakukan operasi pada data, dan menyimpan data XML. Saat deserialisasi, Anda mungkin tidak selalu mendapatkan nilai data yang tepat dari yang asli dikarenakan manipulasi dalam konversi data.

Parameter targetType adalah jenis anggota yang dinyatakan. Parameter ini adalah jenis pengganti yang ditampilkan oleh metode GetDataContractType. Parameter obj mengacu pada objek yang telah dideserialisasi. Objek dapat dikonversi kembali ke jenis aslinya jika ini adalah pengganti. Metode ini mengembalikan objek input jika pengganti tidak menangani objek. Jika tidak, objek yang didedealisasi akan ditampilkan setelah konversinya selesai. Jika ada beberapa jenis pengganti, Anda dapat memberikan konversi data dari pengganti ke jenis utama untuk masing-masing dengan menunjukkan setiap jenis dan konversinya.

Saat menampilkan objek, tabel objek internal diperbarui dengan objek yang ditampilkan oleh pengganti ini. Setiap referensi berikutnya ke instans akan mendapatkan instans pengganti dari tabel objek.

Contoh sebelumnya mengonversi objek jenis InventorySurrogated kembali ke jenis awal Inventory. Dalam hal ini, data langsung ditransfer kembali dari InventorySurrogated ke bidang yang sesuai di Inventory. Karena tidak ada manipulasi data, masing-masing bidang anggota akan menampung nilai yang sama seperti sebelum serialisasi.

Metode GetCustomDataToExport

Saat mengekspor skema, metode GetCustomDataToExport bersifat opsional. Ini digunakan untuk menyisipkan data atau petunjuk tambahan ke dalam skema yang diekspor. Data tambahan dapat disisipkan di tingkat anggota atau tingkat jenis. Misalnya:

public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
{
    Console.WriteLine("GetCustomDataToExport(Member)");
    System.Reflection.FieldInfo fieldInfo = (System.Reflection.FieldInfo)memberInfo;
    if (fieldInfo.IsPublic)
    {
        return "public";
    }
    else
    {
        return "private";
    }
}

Metode ini (dengan dua muatan berlebih) memungkinkan dimasukkannya informasi tambahan ke dalam metadata baik di tingkat anggota atau jenis. Anda dapat menyertakan petunjuk tentang apakah anggota bersifat publik atau privat dan komentar yang akan dipertahankan selama ekspor dan impor skema. Informasi ini akan hilang tanpa metode ini. Metode ini tidak menyebabkan penyisipan atau penghapusan anggota atau jenis, melainkan menambahkan data tambahan ke skema di salah satu tingkat ini.

Metode kelebihan muatan dan dapat mengambil Type (parameter clrtype) atau MemberInfo (parameter memberInfo). Parameter kedua selalu berupa Type (parameter dataContractType). Metode ini dipanggil untuk setiap anggota dan jenis dari jenis pengganti dataContractType.

Salah satu muatan berlebih ini harus menampilkan null atau objek yang dapat diserialisasi. Objek non-null akan diserialisasi sebagai anotasi ke dalam skema yang diekspor. Untuk muatan berlebih Type, setiap jenis yang diekspor ke skema dikirim ke metode ini dalam parameter pertama bersama dengan jenis pengganti sebagai parameter dataContractType. Untuk muatan berlebih MemberInfo, setiap anggota yang diekspor ke skema mengirim informasinya sebagai parameter memberInfo dengan jenis pengganti di parameter kedua.

Metode GetCustomDataToExport (Type, Type)

Metode IDataContractSurrogate.GetCustomDataToExport(Type, Type) dipanggil selama ekspor skema untuk setiap definisi jenis. Metode menambahkan informasi ke jenis dalam skema saat mengekspor. Setiap jenis yang ditentukan dikirim ke metode ini untuk menentukan apakah ada data tambahan yang perlu disertakan dalam skema.

Metode GetCustomDataToExport (MemberInfo, Type)

IDataContractSurrogate.GetCustomDataToExport(MemberInfo, Type) dipanggil selama ekspor untuk setiap anggota dalam jenis yang diekspor. Fungsi ini memungkinkan Anda menyesuaikan komentar apa pun untuk anggota yang akan disertakan dalam skema saat ekspor. Informasi untuk setiap anggota dalam kelas dikirim ke metode ini untuk memeriksa apakah ada data tambahan yang perlu ditambahkan dalam skema.

Contoh di atas mencari setiap anggota pengganti di dataContractType. Kemudian menampilkan pengubah akses yang sesuai untuk setiap bidang. Tanpa penyesuaian ini, nilai default untuk pengubah akses bersifat publik. Oleh karena itu, semua anggota akan ditentukan sebagai publik dalam kode yang dihasilkan menggunakan skema yang diekspor terlepas dari batasan akses yang sebenarnya. Ketika implementasi ini tidak digunakan, anggota numpens akan menjadi publik dalam skema yang diekspor meskipun ditentukan dalam pengganti sebagai privat. Dengan menggunakan metode ini, dalam skema yang diekspor, pengubah akses dapat dihasilkan sebagai privat.

Metode GetReferencedTypeOnImport

Metode ini memetakan Type pengganti ke jenis asli. Metode ini bersifat opsional untuk impor skema.

Saat membuat pengganti yang mengimpor skema dan menghasilkan kode untuknya, tugas berikutnya adalah menentukan jenis instans pengganti ke jenis aslinya.

Jika kode yang dihasilkan perlu merujuk ke jenis pengguna yang ada, ini dilakukan dengan menerapkan metode GetReferencedTypeOnImport.

Saat mengimpor skema, metode ini dipanggil untuk setiap deklarasi jenis untuk memetakan kontrak data pengganti ke suatu jenis. Parameter string typeName dan typeNamespace menentukan nama dan namespace layanan jenis pengganti. Nilai yang ditampilkan untuk GetReferencedTypeOnImport digunakan untuk menentukan apakah jenis baru perlu dihasilkan. Metode ini harus menampilkan jenis yang valid atau null. Untuk jenis yang valid, jenis yang ditampilkan akan digunakan sebagai jenis referensi dalam kode yang dihasilkan. Jika null ditampilkan, tidak ada jenis yang akan dirujuk dan jenis baru harus dibuat. Jika ada beberapa pengganti, Anda dapat melakukan pemetaan untuk setiap jenis pengganti kembali ke jenis awalnya.

Parameter customData adalah objek yang awalnya ditampilkan dari GetCustomDataToExport. customData ini digunakan saat penulis pengganti ingin menyisipkan data/petunjuk tambahan ke dalam metadata untuk digunakan selama impor untuk menghasilkan kode.

Metode ProcessImportedType

Metode ProcessImportedType menyesuaikan jenis apa pun yang dibuat dari impor skema. Metode ini bersifat opsional.

Saat mengimpor skema, metode ini memungkinkan disesuaikannya semua jenis dan informasi kompilasi yang diimpor. Misalnya:

public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
{
    Console.WriteLine("ProcessImportedType");
    foreach (CodeTypeMember member in typeDeclaration.Members)
    {
        object memberCustomData = member.UserData[typeof(IDataContractSurrogate)];
        if (memberCustomData != null
          && memberCustomData is string
          && ((string)memberCustomData == "private"))
        {
            member.Attributes = ((member.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private);
        }
    }
    return typeDeclaration;
}

Selama impor, metode ini dipanggil untuk setiap jenis yang dihasilkan. Ubah CodeTypeDeclaration yang ditentukan atau ubah CodeCompileUnit. Ini termasuk mengubah nama, anggota, atribut, dan berbagai properti CodeTypeDeclaration lainnya. Dengan memproses CodeCompileUnit, Anda dapat memodifikasi arahan, namespace layanan, assembly referensi, dan beberapa aspek lainnya.

Parameter CodeTypeDeclaration berisi deklarasi jenis DOM kode. Parameter CodeCompileUnit memungkinkan modifikasi untuk memproses kode. Menampilkan null akan menyebabkan deklarasi jenis dibuang. Sebaliknya, saat menampilkan CodeTypeDeclaration, modifikasi dipertahankan.

Jika data kustom disisipkan selama ekspor metadata, data tersebut perlu diberikan kepada pengguna selama impor agar dapat digunakan. Data kustom ini dapat digunakan untuk petunjuk model pemrograman atau komentar lainnya. Setiap instans CodeTypeDeclaration dan CodeTypeMember menyertakan data kustom sebagai properti UserData, transmisi ke jenis IDataContractSurrogate.

Contoh di atas melakukan beberapa perubahan pada skema yang diimpor. Kode mempertahankan anggota privat jenis asli dengan menggunakan pengganti. Pengubah akses default saat mengimpor skema adalah public. Oleh karena itu, semua anggota skema pengganti akan diterbitkan kecuali jika dimodifikasi, seperti dalam contoh ini. Selama ekspor, data kustom disisipkan ke dalam metadata tentang anggota mana yang privat. Contoh ini mencari data kustom, memeriksa apakah pengubah akses bersifat privat, dan kemudian memodifikasi anggota yang sesuai untuk menjadi privat dengan mengatur atributnya. Tanpa penyesuaian ini, anggota numpens akan ditentukan sebagai publik, bukan privat.

Metode GetKnownCustomDataTypes

Metode ini memperoleh jenis data kustom yang ditentukan dari skema. Metode tersebut bersifat opsional untuk impor skema.

Metode ini dipanggil di awal ekspor dan impor skema. Metode menampilkan jenis data kustom yang digunakan dalam skema yang diekspor atau diimpor. Metode ini meneruskan Collection<T> (parameter customDataTypes), yang merupakan koleksi jenis. Metode ini akan menambahkan jenis tambahan yang diketahui ke koleksi ini. Jenis data kustom yang diketahui diperlukan untuk mengaktifkan serialisasi dan deserialisasi data kustom menggunakan DataContractSerializer. Untuk informasi selengkapnya, lihat Jenis yang Diketahui Kontrak Data.

Menerapkan Pengganti

Untuk menggunakan pengganti kontrak data dalam WCF, Anda harus mengikuti beberapa prosedur khusus.

Untuk Menggunakan Pengganti untuk Serialisasi dan Deserialisasi

Gunakan DataContractSerializer untuk melakukan serialisasi dan deserialisasi data dengan pengganti. DataContractSerializer dibuat oleh DataContractSerializerOperationBehavior. Pengganti juga harus ditentukan.

Untuk menerapkan serialisasi dan deserialisasi
  1. Buat instans ServiceHost untuk layanan Anda. Untuk instruksi lengkapnya, lihat Pemrograman WCF Dasar.

  2. Untuk setiap ServiceEndpoint host layanan yang ditentukan, temukan OperationDescription-nya.

  3. Cari perilaku operasi untuk menentukan apakah instans DataContractSerializerOperationBehavior ditemukan.

  4. Jika DataContractSerializerOperationBehavior ditemukan, atur properti DataContractSurrogate-nya ke instans pengganti baru. Jika DataContractSerializerOperationBehavior tidak ditemukan, buat instans baru dan atur anggota perilaku baru DataContractSurrogate ke instans pengganti baru.

  5. Terakhir, tambahkan perilaku baru ini ke perilaku operasi saat ini, seperti yang ditunjukkan dalam contoh berikut:

    using (ServiceHost serviceHost = new ServiceHost(typeof(InventoryCheck)))
        foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
        {
            foreach (OperationDescription op in ep.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dataContractBehavior =
                    op.Behaviors.Find<DataContractSerializerOperationBehavior>()
                    as DataContractSerializerOperationBehavior;
                if (dataContractBehavior != null)
                {
                    dataContractBehavior.DataContractSurrogate = new InventorySurrogated();
                }
                else
                {
                    dataContractBehavior = new DataContractSerializerOperationBehavior(op);
                    dataContractBehavior.DataContractSurrogate = new InventorySurrogated();
                    op.Behaviors.Add(dataContractBehavior);
                }
            }
        }
    

Untuk Menggunakan Pengganti untuk Impor Metadata

Saat mengimpor metadata seperti WSDL dan XSD untuk menghasilkan kode sisi klien, pengganti perlu ditambahkan ke komponen yang bertanggung jawab untuk menghasilkan kode dari skema XSD, XsdDataContractImporter. Untuk melakukan ini, langsung ubah WsdlImporter yang digunakan untuk mengimpor metadata.

Untuk mengimplementasikan pengganti untuk impor metadata
  1. Impor metadata menggunakan kelas WsdlImporter.

  2. Gunakan metode TryGetValue untuk memeriksa apakah XsdDataContractImporter telah ditentukan.

  3. Jika metode TryGetValue menampilkan false, buat XsdDataContractImporter baru dan atur properti Options-nya ke instans kelas ImportOptions baru. Jika tidak, gunakan pengimpor yang ditampilkan oleh parameter out metode TryGetValue.

  4. Jika XsdDataContractImporter tidak memiliki ImportOptions yang ditentukan, atur properti menjadi instans kelas ImportOptions baru.

  5. Atur properti DataContractSurrogateImportOptions dari XsdDataContractImporter ke instans pengganti baru.

  6. Tambahkan XsdDataContractImporter ke koleksi yang ditampilkan oleh properti StateWsdlImporter (diwarisi dari kelas MetadataExporter.)

  7. Gunakan metode ImportAllContractsWsdlImporter untuk mengimpor semua kontrak data dalam skema. Selama langkah terakhir, kode dihasilkan dari skema yang dimuat dengan memanggil pengganti.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaDocs = mexClient.GetMetadata();
    WsdlImporter importer = new WsdlImporter(metaDocs);
    object dataContractImporter;
    XsdDataContractImporter xsdInventoryImporter;
    if (!importer.State.TryGetValue(typeof(XsdDataContractImporter),
        out dataContractImporter))
        xsdInventoryImporter = new XsdDataContractImporter();
    
    xsdInventoryImporter = (XsdDataContractImporter)dataContractImporter;
    xsdInventoryImporter.Options ??= new ImportOptions();
    xsdInventoryImporter.Options.DataContractSurrogate = new InventorySurrogated();
    importer.State.Add(typeof(XsdDataContractImporter), xsdInventoryImporter);
    
    Collection<ContractDescription> contracts = importer.ImportAllContracts();
    

Untuk Menggunakan Pengganti untuk Ekspor Metadata

Secara default, saat mengekspor metadata dari WCF untuk layanan, skema WSDL dan XSD perlu dibuat. Pengganti perlu ditambahkan ke komponen yang bertanggung jawab untuk menghasilkan skema XSD untuk jenis kontrak data, XsdDataContractExporter. Untuk melakukannya, gunakan perilaku yang mengimplementasikan IWsdlExportExtension untuk memodifikasi WsdlExporter, atau langsung memodifikasi WsdlExporter yang digunakan untuk mengekspor metadata.

Untuk menggunakan pengganti untuk ekspor metadata
  1. Buat WsdlExporter baru atau gunakan parameter wsdlExporter yang diteruskan ke metode ExportContract.

  2. Gunakan fungsi TryGetValue untuk memeriksa apakah XsdDataContractExporter telah ditentukan.

  3. Jika TryGetValue menampilkan false, buat XsdDataContractExporter baru dengan skema XML yang dihasilkan dari WsdlExporter, dan tambahkan ke koleksi yang ditampilkan oleh properti StateWsdlExporter. Jika tidak, gunakan pengekspor yang ditampilkan oleh parameter out metode TryGetValue.

  4. Jika XsdDataContractExporter tidak memiliki ExportOptions yang ditentukan, atur properti Options menjadi instans kelas ExportOptions baru.

  5. Atur properti DataContractSurrogateExportOptions dari XsdDataContractExporter ke instans pengganti baru. Langkah berikutnya untuk mengekspor metadata tidak memerlukan perubahan apa pun.

    WsdlExporter exporter = new WsdlExporter();
    //or
    //public void ExportContract(WsdlExporter exporter,
    // WsdlContractConversionContext context) { ... }
    object dataContractExporter;
    XsdDataContractExporter xsdInventoryExporter;
    if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter),
        out dataContractExporter))
    {
        xsdInventoryExporter = new XsdDataContractExporter(exporter.GeneratedXmlSchemas);
    }
    else
    {
        xsdInventoryExporter = (XsdDataContractExporter)dataContractExporter;
    }
    
    exporter.State.Add(typeof(XsdDataContractExporter), xsdInventoryExporter);
    
    if (xsdInventoryExporter.Options == null)
        xsdInventoryExporter.Options = new ExportOptions();
    xsdInventoryExporter.Options.DataContractSurrogate = new InventorySurrogated();
    

Lihat juga