Kontrak Data yang Kompatibel Dengan Penerusan

Fitur sistem kontrak data Windows Communication Foundation (WCF) adalah bahwa kontrak dapat berkembang dari waktu ke waktu dengan cara yang tidak memisahkan. 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 kontrak data yang lebih lama. 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 penerapan versi, round-tripping, harus dibangun ke dalam jenis dari versi pertama agar berfungsi dengan baik.

Round-Tripping

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

Untuk mengaktifkan round-trip jenis tertentu, jenisnya harus mengimplementasikan antarmuka IExtensibleDataObject. Antarmuka berisi satu properti, ExtensionData (mengembalikan jenis ExtensionDataObject). 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 antarmuka IExtensibleDataObject.

[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 ke tempat 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, harapan itu tidak terpenuhi, dan titik akhir entah bagaimana harus mendeteksi dan mengakomodasi perubahan.

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

Fitur round-tripping dapat dinonaktifkan, baik dengan mengatur ignoreExtensionDataObject ke true di DataContractSerializer konstruktor atau dengan mengatur properti IgnoreExtensionDataObject ke true pada ServiceBehaviorAttribute. Ketika fitur ini nonaktif, deserializer tidak akan mengisi properti ExtensionData, dan serializer tidak akan memancarkan konten properti.

Lihat juga