2011-04-11 14 views
12

Me gustaría agregar un DataMember a uno de mis DataContract s. Me gustaría saber cómo se comportarán los servidores y clientes existentes en presencia de un nuevo DataMember si una de las partes no se actualiza.Agregar un DataMember a un DataContract existente en WCF

recuerdo hay una manera de hacer que el DataMember opcional, pero me pregunto si funcionaría en todos los escenarios:

  • cliente actualizado => Servidor antiguo
  • viejo cliente => Servidor actualizado
  • actualizado cliente < = servidor antiguo
  • viejo cliente < = actualizada del servidor

Respuesta

15

WCF manejará con gracia los nuevos miembros que no reconoce. El consumidor del contrato (ya sea del lado del cliente o del servidor) simplemente no "verá" a ese miembro, por lo tanto, una consecuencia es que el nuevo miembro nunca debe ser una propiedad IsRequired=true.

Además, WCF enlazará de forma transparente la nueva propiedad entre componentes siempre que DataContract implemente IExtensibleDataObject. Por ejemplo, si el mensaje va camino:

cliente actualizado => antiguo servidor => actualizada del servidor

entonces el servidor actualizado en el extremo de la cadena todavía ver el nuevo DataMember. Sin embargo, el "servidor anterior" no verá ese nuevo DataMember.

Si un servidor antiguo envía un mensaje a un cliente actualizado, entonces el nuevo DataMember se establecerá en default(type) al deserializarse en el nuevo cliente.

Hay más acerca de Best Practices for DataContract versioning here.

Y este artículo analiza the difference between Breaking and Non-Breaking changes.

+0

Desde el último enlace que proporcionó: 'En la mayoría de los casos, agregar o eliminar un miembro de datos no es un cambio de última hora' –

Cuestiones relacionadas