Sdílet prostřednictvím


Kontrakty dat s dopřednou kompatibilitou

Funkce systému kontraktů dat WCF (Windows Communication Foundation) spočívá v tom, že kontrakty se můžou v průběhu času vyvíjet v neprobíraných způsobech. To znamená, že klient se starší verzí datového kontraktu může komunikovat se službou s novější verzí stejného datového kontraktu nebo klient s novější verzí datové smlouvy může komunikovat se starší verzí stejného datového kontraktu. Další informace najdete v tématu Osvědčené postupy: Správa verzí kontraktů dat.

Většinu funkcí správy verzí můžete použít podle potřeby při vytváření nových verzí existujícího kontraktu dat. Aby ale fungovala správně, musí být jedna funkce správy verzí, která je zaokrouhlená, součástí typu z první verze.

Kruhové jízdy

K odezvě dochází v případě, že data procházejí z nové verze do staré verze a zpět do nové verze kontraktu dat. Odezva zaručuje, že se neztratí žádná data. Povolením odezvy se typ dopředu kompatibilní s případnými budoucími změnami podporovanými modelem správy verzí kontraktů dat.

Chcete-li povolit odezvu pro určitý typ, musí typ implementovat IExtensibleDataObject rozhraní. Rozhraní obsahuje jednu vlastnost ExtensionData (vracející ExtensionDataObject typ). Vlastnost ukládá všechna data z budoucích verzí datového kontraktu, která nejsou pro aktuální verzi neznámá.

Příklad

Následující kontrakt dat není kompatibilní s budoucími změnami.

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

Aby byl typ kompatibilní s budoucími změnami (například přidáním nového datového členu s názvem "phoneNumber"), implementujte IExtensibleDataObject rozhraní.

[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

Když infrastruktura WCF narazí na data, která nejsou součástí původního kontraktu dat, data se uloží do vlastnosti a zachovají se. Nezpracová se žádným jiným způsobem, s výjimkou dočasného úložiště. Pokud se objekt vrátí zpět do původního umístění, vrátí se také původní (neznámá) data. Data proto provedla odezvu do a z původního koncového bodu bez ztráty. Všimněte si však, že pokud původní koncový bod vyžadoval zpracování dat, očekávaná očekávání je unmetovaná a koncový bod musí nějak zjistit a přizpůsobit změnu.

Typ ExtensionDataObject neobsahuje žádné veřejné metody ani vlastnosti. Proto není možné získat přímý přístup k datům uloženým ExtensionData uvnitř vlastnosti.

Funkci odezvy může být vypnuta, a to buď nastavením ignoreExtensionDataObject v true konstruktoruDataContractSerializer, nebo nastavením IgnoreExtensionDataObject vlastnosti na true hodnotu .ServiceBehaviorAttribute Pokud je tato funkce vypnutá, deserializátor tuto vlastnost nenaplní ExtensionData a serializátor nevygeneruje obsah vlastnosti.

Viz také