2010-08-08 20 views
7

He convertido mi servicio web al servicio wcf que tiene algunos datos. Como una buena práctica, se menciona y es aconsejable que los DataContracts hereden de IExtensibleDataObject. Entiendo que, en caso de agregar o eliminar miembros de datos, IExtensibleDataObject es útil. Pero no puedo saber cómo accederán los clientes a los miembros de datos eliminados. Aquí está mi código:Uso de IExtensibleDataObject en clientes

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")] 
public class MyWebService { 
    [OperationContract] 
    public Employee Add(Employee emp) 
    { 
     // Some Processing 
    } 
} 

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Ahora, en mi próxima versión del servicio web que hizo algunos cambios en DataContract como

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 
    [DataMember(IsRequired = true)] public string MiddleName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Sin embargo, mi cliente que está accediendo a mi versión anterior del servicio web es ahora conseguir de error por no suministrar el campo MiddleName. Todavía estoy confundido por el uso de IExtensionDataObject.

Respuesta

12

Me temo que no es el uso correcto de IExtensibleDataObject, la interfaz IExtensibleDataObject está diseñado para soportar la versión ida y vuelta de, tener una lectura de este artículo de MSDN sobre la compatibilidad hacia adelante:

http://msdn.microsoft.com/en-us/library/ms731083.aspx

Y aquí es otro artículo sobre las mejores prácticas sobre datos de versiones Contrato en general: http://msdn.microsoft.com/en-us/library/ms733832.aspx

+1

Lo que es incorrecto respecto? .NET genera automáticamente el campo de respaldo, y la documentación de Microsoft no explica por qué necesita ser virtual y por qué necesita el campo de respaldo especificado manualmente. – ShadowChaser

11

que es un uso incorrecto de IExtensibleDataObject. Ha modificado el contrato de datos en el lado del servidor y ha marcado un campo nuevo según sea necesario, lo que significa que tiene versiones rotas y nada le ayuda.

IExtensibleDataObject es para otro propósito. Supongamos que ha modificado su cliente para que el contrato de datos en el cliente contenga MiddleName. Ahora configura el MiddleName y usa Add service operation. ¿Qué valor tendrá MiddleName en el objeto Employee devuelto? Si no usa IExtensibleDataObject, el valor será nulo; si usa IExtensibleDataObject, el valor será el mismo que el establecido para ingresar el parámetro.

Al utilizar DataContractSerializer WCF descarta todos los parámetros que no se entienden. IExtensibleDataObject evita esto almacenando todos esos parámetros en una colección especial y enviándolos de vuelta al cliente.

Si desea utilizar el contrato de versiones, olvídese de los campos obligatorios. Eso es lo primero que lo romperá.

Saludos, Ladislav

0

Hacer ExtensionData propiedad "virtual", como se muestra a continuación:

public virtual ExtensionDataObject ExtensionData 
{ 
    get { return theData; } 
    set { theData = value; } 
} 
Cuestiones relacionadas