Contratos de dados compatíveis por encaminhamento

Um recurso do sistema de contrato de dados do WCF (Windows Communication Foundation) é que os contratos podem evoluir ao longo do tempo de maneira não interruptiva. Ou seja, um cliente com uma versão mais antiga de um contrato de dados pode se comunicar com um serviço com uma versão mais recente do mesmo contrato de dados ou um cliente com uma versão mais recente de um contrato de dados pode se comunicar com uma versão mais antiga do mesmo contrato de dados. Para obter mais informações, confira Melhores práticas: Controle de versão do serviço.

Você pode aplicar a maioria dos recursos de controle de versão conforme necessário quando novas versões de um contrato de dados existente são criadas. No entanto, um recurso de controle de versão, o round-tripping, deve ser incorporado ao tipo da primeira versão para funcionar corretamente.

Round-Tripping

O round-tripping ocorre quando os dados passam de uma nova versão para uma versão antiga e voltam para a nova versão de um contrato de dados. O round-tripping garante que nenhum dado seja perdido. Habilitar o round-tripping torna o tipo compatível com o encaminhamento com quaisquer alterações futuras compatíveis com o modelo de controle de versão do contrato de dados.

Para habilitar o arredondamento para um tipo específico, o tipo deve implementar a interface IExtensibleDataObject. A interface contém uma propriedade ExtensionData (retornando o tipo ExtensionDataObject). A propriedade armazena todos os dados de versões futuras do contrato de dados desconhecido na versão atual.

Exemplo

O contrato de dados a seguir não é compatível com alterações futuras.

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

Para tornar o tipo compatível com alterações futuras (como adicionar um novo membro de dados chamado "phoneNumber"), implemente a interface IExtensibleDataObject.

[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

Quando a infraestrutura do WCF encontra dados que não fazem parte do contrato de dados original, os dados são armazenados na propriedade e preservados. Eles não são processados de outra forma, exceto para armazenamento temporário. Se o objeto for retornado de volta ao local de origem, os dados originais (desconhecidos) também serão retornados. Portanto, os dados fizeram uma viagem de ida e volta de e para o ponto de extremidade de origem sem perda. No entanto, observe que, se o ponto de extremidade de origem exigisse que os dados fossem processados, essa expectativa não seria atendida e o ponto de extremidade deveria de alguma forma detectar e acomodar a alteração.

O tipo ExtensionDataObject não contém métodos ou propriedades públicas. Portanto, é impossível obter acesso direto aos dados armazenados dentro da propriedade ExtensionData.

O recurso de arredondamento pode ser desativado, seja definindo ignoreExtensionDataObject como true no construtor DataContractSerializer ou definindo a propriedade IgnoreExtensionDataObject como true no ServiceBehaviorAttribute. Quando esse recurso estiver desativado, o desserializador não preencherá a propriedade ExtensionData e o serializador não emitirá o conteúdo da propriedade.

Confira também