Kontrakty danych zgodne z nowszymi wersjami

Funkcja systemu kontraktów danych windows Communication Foundation (WCF) polega na tym, że kontrakty mogą ewoluować w czasie w sposób niełamujący. Oznacza to, że klient ze starszą wersją kontraktu danych może komunikować się z usługą z nowszą wersją tego samego kontraktu danych lub klient z nowszą wersją kontraktu danych może komunikować się ze starszą wersją tego samego kontraktu danych. Aby uzyskać więcej informacji, zobacz Best Practices: Data Contract Versioning (Najlepsze rozwiązania: przechowywanie wersji kontraktu danych).

Większość funkcji przechowywania wersji można zastosować zgodnie z potrzebami, gdy tworzone są nowe wersje istniejącego kontraktu danych. Jednak jedna funkcja przechowywania wersji, zaokrąglająca, musi być wbudowana w typ z pierwszej wersji, aby działać prawidłowo.

Zaokrąglanie

Round-tripping występuje, gdy dane przechodzą z nowej wersji do starej wersji i z powrotem do nowej wersji kontraktu danych. Zaokrąglanie gwarantuje, że żadne dane nie zostaną utracone. Włączenie dwukierunkowego łączenia sprawia, że typ jest zgodny z wszelkimi przyszłymi zmianami obsługiwanymi przez model przechowywania wersji kontraktu danych.

Aby włączyć round-tripping dla określonego typu, typ musi zaimplementować IExtensibleDataObject interfejs. Interfejs zawiera jedną właściwość ExtensionData (zwraca typ ExtensionDataObject ). Właściwość przechowuje wszystkie dane z przyszłych wersji kontraktu danych, które są nieznane dla bieżącej wersji.

Przykład

Poniższy kontrakt danych nie jest zgodny z przyszłymi zmianami.

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

Aby wprowadzić typ zgodny z przyszłymi zmianami (na przykład dodanie nowego elementu członkowskiego danych o nazwie "phoneNumber"), zaimplementuj IExtensibleDataObject interfejs.

[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

Gdy infrastruktura WCF napotka dane, które nie są częścią oryginalnego kontraktu danych, dane są przechowywane we właściwości i zachowywane. Nie jest przetwarzany w żaden inny sposób z wyjątkiem magazynu tymczasowego. Jeśli obiekt zostanie zwrócony z powrotem do miejsca, z którego pochodzi, zwracane są również oryginalne (nieznane) dane. W związku z tym dane dokonały rundy do i z punktu końcowego źródłowego bez utraty. Należy jednak pamiętać, że jeśli źródłowy punkt końcowy wymaga przetworzenia danych, oczekiwanie jest niezaspokojane, a punkt końcowy musi w jakiś sposób wykryć i uwzględnić zmianę.

Typ ExtensionDataObject nie zawiera żadnych metod publicznych ani właściwości. W związku z tym nie można uzyskać bezpośredniego dostępu do danych przechowywanych wewnątrz ExtensionData właściwości.

Funkcja zaokrąglania może być wyłączona, ustawiając ignoreExtensionDataObjecttrue wartość w konstruktorze DataContractSerializer lub przez ustawienie IgnoreExtensionDataObject właściwości true na wartość na ServiceBehaviorAttribute. Gdy ta funkcja jest wyłączona, deserializator nie wypełni ExtensionData właściwości, a serializator nie będzie emitować zawartości właściwości.

Zobacz też