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 ignoreExtensionDataObject
true
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.