Sdílet prostřednictvím


Forward-Compatible Datové kontrakty

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 jedna funkce správy verzí, round-tripping, mohla fungovat správně, musí být součástí typu již od první verze.

Round-Tripping

Kround-trippingu dochází, když data procházejí z nové verze do staré verze a zpět do nové verze datového kontraktu. Obousměrné zpracování zaručuje, že se neztratí žádná data. Povolení obousměrného zpracování činí typ kompatibilním do budoucna s případnými budoucími změnami podporovanými modelem verzování datového kontraktu.

K umožnění obousměrné konverze pro konkrétní typ musí tento 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á jsou 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 datového kontraktu, tato data se uloží do objektové 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 prošla tam a zpět 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, toto očekávání nebylo splněno a koncový bod musí nějak tuto změnu zjistit a přizpůsobit se jí.

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.

Funkce round-tripping může být vypnuta buď nastavením ignoreExtensionDataObject na true v konstruktoru DataContractSerializer, nebo nastavením vlastnosti IgnoreExtensionDataObject na true na ServiceBehaviorAttribute. Pokud je tato funkce vypnutá, deserializátor tuto vlastnost nenaplní ExtensionData a serializátor nevygeneruje obsah vlastnosti.

Viz také