Bagikan melalui


Kontrak Data Forward-Compatible

Fitur sistem kontrak data Windows Communication Foundation (WCF) adalah bahwa kontrak dapat berkembang dari waktu ke waktu dengan cara yang tidak pecah. Artinya, klien dengan versi kontrak data yang lebih lama dapat berkomunikasi dengan layanan dengan versi yang lebih baru dari kontrak data yang sama, atau klien dengan versi kontrak data yang lebih baru dapat berkomunikasi dengan versi yang lebih lama dari kontrak data yang sama. Untuk informasi selengkapnya, lihat Praktik Terbaik: Penerapan Versi Kontrak Data.

Anda dapat menerapkan sebagian besar fitur penerapan versi sesuai kebutuhan saat versi baru dari kontrak data yang ada dibuat. Namun, satu fitur versi, round-tripping, harus diterapkan pada tipe sejak versi pertama agar berfungsi dengan baik.

Round-Tripping

Round-tripping terjadi ketika data berpindah dari versi baru ke versi lama dari sebuah kontrak data dan kembali lagi ke versi baru. Round-tripping menjamin bahwa tidak ada data yang hilang. Mengaktifkan round-tripping membuat jenis kompatibel dengan perubahan di masa mendatang yang didukung oleh model penerapan versi kontrak data.

Untuk mengaktifkan round-tripping untuk jenis tertentu, jenis harus mengimplementasikan IExtensibleDataObject antarmuka. Antarmuka berisi satu properti, ExtensionData (mengembalikan ExtensionDataObject jenis). Properti menyimpan data apa pun dari versi kontrak data yang akan datang yang tidak diketahui oleh versi saat ini.

Contoh

Kontrak data berikut tidak kompatibel dengan perubahan di masa mendatang.

[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}
<DataContract()> _
Public Class Person
    <DataMember()> _
    Public fullName As String
End Class

Untuk membuat jenis kompatibel dengan perubahan di masa mendatang (seperti menambahkan anggota data baru bernama "phoneNumber"), terapkan IExtensibleDataObject antarmuka.

[DataContract]
public class Person : IExtensibleDataObject
{
    [DataMember]
    public string fullName;
    private ExtensionDataObject theData;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return theData; }
        set { theData = value; }
    }
}
<DataContract()> _
Public Class Person
    Implements IExtensibleDataObject
    <DataMember()> _
    Public fullName As String
    Private theData As ExtensionDataObject


    Public Overridable Property ExtensionData() As _
     ExtensionDataObject Implements _
     IExtensibleDataObject.ExtensionData
        Get
            Return theData
        End Get
        Set
            theData = value
        End Set
    End Property
End Class

Ketika infrastruktur WCF menemukan data yang bukan bagian dari kontrak data asli, data disimpan di properti dan dipertahankan. Ini tidak diproses dengan cara lain kecuali untuk penyimpanan sementara. Jika objek dikembalikan kembali ke asalnya, data asli (tidak diketahui) juga dikembalikan. Oleh karena itu, data telah melakukan perjalanan pulang pergi ke dan dari titik akhir asal tanpa kehilangan. Namun, perhatikan bahwa jika titik akhir asal mengharuskan data diproses, ekspektasi tersebut tidak terpenuhi, dan titik akhir harus mendeteksi dan mengakomodasi perubahan.

Jenis ExtensionDataObject tidak berisi metode atau properti publik. Dengan demikian, tidak mungkin mendapatkan akses langsung ke data yang disimpan dalam properti ExtensionData.

Fitur round-tripping dapat dinonaktifkan dengan mengatur ignoreExtensionDataObject ke true di konstruktor DataContractSerializer atau dengan mengatur properti IgnoreExtensionDataObject ke true pada ServiceBehaviorAttribute. Ketika fitur ini dimatikan, deserializer tidak akan mengisi properti ExtensionData, dan serializer tidak akan menghasilkan isi dari properti tersebut.

Lihat juga