Bagikan melalui


Kesetaraan Kontrak Data

Agar klien berhasil mengirim data jenis tertentu ke layanan, atau layanan berhasil mengirim data ke klien, jenis yang dikirim tidak harus ada di pihak penerima. Satu-satunya persyaratan adalah bahwa kontrak data dari kedua jenis itu setara. (Terkadang, kesetaraan yang ketat tidak diperlukan, seperti yang dibahas dalam Versi Kontrak Data.)

Agar kontrak data setara, mereka harus memiliki namespace layanan dan nama yang sama. Selain itu, setiap anggota data di satu sisi harus memiliki anggota data yang setara di sisi lain.

Agar anggota data setara, mereka harus memiliki nama yang sama. Selain itu, mereka harus mewakili jenis data yang sama; yaitu, kontrak data mereka harus setara.

Catatan

Perhatikan bahwa nama kontrak data dan namespace layanan, serta nama anggota data, peka huruf besar-kecil.

Untuk informasi selengkapnya tentang nama kontrak data dan namespace layanan, serta nama anggota data, lihat Nama Kontrak Data.

Jika dua jenis ada di sisi yang sama (pengirim atau penerima) dan kontrak datanya tidak setara (misalnya, mereka memiliki anggota data yang berbeda), Anda tidak boleh memberi mereka nama dan namespace layanan yang sama. Melakukannya dapat memunculkan pengecualian.

Kontrak data untuk jenis berikut setara:

[DataContract]
public class Customer
{
    [DataMember]
    public string fullName;

    [DataMember]
    public string telephoneNumber;
}

[DataContract(Name = "Customer")]
public class Person
{
    [DataMember(Name = "fullName")]
    private string nameOfPerson;

    private string address;

    [DataMember(Name = "telephoneNumber")]
    private string phoneNumber;
}
<DataContract()> _
Public Class Customer

    <DataMember()> _
    Public fullName As String

    <DataMember()> _
    Public telephoneNumber As String
End Class

<DataContract(Name:="Customer")> _
Public Class Person

    <DataMember(Name:="fullName")> _
    Private nameOfPerson As String

    Private address As String

    <DataMember(Name:="telephoneNumber")> _
    Private phoneNumber As String
End Class

Kesetaraan Urutan Anggota Data dan Kontrak Data

Menggunakan properti Order dari kelas DataMemberAttribute dapat memengaruhi kesetaraan kontrak data. Kontrak data harus memiliki anggota yang muncul dalam urutan yang sama agar setara. Urutan defaultnya berdasarkan abjad. Untuk informasi selengkapnya, lihat Urutan Anggota Data.

Misalnya, kode berikut menghasilkan kontrak data yang setara.

[DataContract(Name = "Coordinates")]
public class Coords1
{
    [DataMember]
    public int X;
    [DataMember]
    public int Y;
    // Order is alphabetical (X,Y).
}

[DataContract(Name = "Coordinates")]
public class Coords2
{
    [DataMember]
    public int Y;
    [DataMember]
    public int X;
    // Order is alphabetical (X,Y), equivalent
    // to the preceding code.
}

[DataContract(Name = "Coordinates")]
public class Coords3
{
    [DataMember(Order = 2)]
    public int Y;
    [DataMember(Order = 1)]
    public int X;
    // Order is according to the Order property (X,Y),
    // equivalent to the preceding code.
}
<DataContract(Name:="Coordinates")> _
Public Class Coords1
    <DataMember()> _
    Public X As Integer
    <DataMember()> _
    Public Y As Integer
    ' Order is alphabetical (X,Y).
End Class

<DataContract(Name:="Coordinates")> _
Public Class Coords2

    <DataMember()> _
    Public Y As Integer
    <DataMember()> _
    Public X As Integer
    ' Order is alphabetical (X,Y), equivalent 
    ' to the preceding code.
End Class

<DataContract(Name:="Coordinates")> _
Public Class Coords3
    <DataMember(Order:=2)> _
    Public Y As Integer
    <DataMember(Order:=1)> _
    Public X As Integer
    ' Order is according to the Order property (X,Y), 
    ' equivalent to the preceding code.
End Class

Tetapi hal berikut ini tidak menghasilkan kontrak data yang setara.

[DataContract(Name = "Coordinates")]
public class Coords4
{
    [DataMember(Order = 1)]
    public int Y;
    [DataMember(Order = 2)]
    public int X;
    // Order is according to the Order property (Y,X),
    // different from the preceding code.
}
<DataContract(Name:="Coordinates")> _
Public Class Coords4

    <DataMember(Order:=1)> _
    Public Y As Integer
    <DataMember(Order:=2)> _
    Public X As Integer
    ' Order is according to the Order property (Y,X), 
    ' different from the preceding code.
End Class

Warisan, Antarmuka, dan Kesetaraan Kontrak Data

Saat menentukan kesetaraan, kontrak data yang mewarisi dari kontrak data lain ditangani seolah-olah itu hanya satu kontrak data yang mencakup semua anggota data dari jenis dasar. Harap diingat bahwa urutan anggota data harus cocok dan anggota jenis dasar mendahului anggota jenis turunan dalam urutan. Selanjutnya, jika seperti pada contoh kode berikut, dua anggota data memiliki nilai urutan yang sama, urutan untuk anggota data tersebut berdasarkan abjad. Untuk informasi selengkapnya, lihat Urutan Anggota Data.

Dalam contoh berikut, kontrak data untuk jenis Employee sama dengan kontrak data untuk jenis Worker.

[DataContract]
public class Person
{
    [DataMember]
    public string name;
}
[DataContract]
public class Employee : Person
{
    [DataMember]
    public int department;
    [DataMember]
    public string title;
    [DataMember]
    public int salary;
}
// Order is "name", "department", "salary", "title"
// (base class first, then alphabetical).

[DataContract(Name = "Employee")]
public class Worker
{
    [DataMember(Order = 1)]
    public string name;
    [DataMember(Order = 2)]
    public int department;
    [DataMember(Order = 2)]
    public string title;
    [DataMember(Order = 2)]
    public int salary;
}
// Order is "name", "department", "salary", "title"
// (Order=1 first, then Order=2 in alphabetical order),
// which is equivalent to the Employee order}.
<DataContract()> _
Public Class Person
    <DataMember()> Public name As String
End Class

<DataContract()> _
Public Class Employee
    Inherits Person
    <DataMember()> Public department As Integer
    <DataMember()> Public title As String
    <DataMember()> Public salary As Integer
End class

' Order is "name", "department", "salary", "title" 
' (base class first, then alphabetical).

<DataContract(Name:="Employee")> _
Public Class Worker

    <DataMember(Order:=1)> _
    Public name As String
    <DataMember(Order:=2)> _
    Public department As Integer
    <DataMember(Order:=2)> _
    Public title As String
    <DataMember(Order:=2)> _
    Public salary As Integer
End Class
' Order is "name", "department", "salary", "title" 
' (Order=1 first, then Order=2 in alphabetical order), 
' which is equivalent to the Employee order}.

Saat meneruskan parameter dan mengembalikan nilai antara klien dan layanan, kontrak data dari kelas dasar tidak dapat dikirim saat titik akhir penerima mengharapkan kontrak data dari kelas turunan. Hal ini sesuai dengan prinsip pemrograman berorientasi objek. Pada contoh sebelumnya, objek berjenis Person tidak dapat dikirim saat Employee diharapkan.

Kontrak data dari kelas turunan dapat dikirim saat kontrak data dari kelas dasar diharapkan, tetapi hanya jika titik akhir penerima "tahu" dari jenis turunan menggunakan KnownTypeAttribute. Untuk informasi selengkapnya, lihat Jenis yang Diketahui Kontrak Data. Pada contoh sebelumnya, objek berjenis Employee dapat dikirim saat Person diharapkan, tetapi hanya jika kode penerima menggunakan KnownTypeAttribute untuk memasukkannya ke dalam daftar jenis yang diketahui.

Saat meneruskan parameter dan mengembalikan nilai antar aplikasi, jika jenis yang diharapkan adalah antarmuka, itu setara dengan jenis yang diharapkan dari jenis Object. Karena setiap jenis pada akhirnya berasal dari Object, setiap kontrak data pada akhirnya berasal dari kontrak data untuk Object. Dengan demikian, semua jenis kontrak data dapat diteruskan saat antarmuka diharapkan. Langkah-langkah tambahan diperlukan untuk berhasil bekerja dengan antarmuka; untuk informasi selengkapnya, lihat Jenis Kontrak Data yang Diketahui.

Lihat juga