Control de versiones del servicioService Versioning

Después de la implementación inicial y de haber transcurrido potencialmente varias horas durante su duración, los servicios (y los puntos de conexión que exponen) pueden necesitar ser cambiados debido a diversas razones, como cambios en las necesidades comerciales, requisitos de tecnología de la información o para resolver otros problemas.After initial deployment, and potentially several times during their lifetime, services (and the endpoints they expose) may need to be changed for a variety of reasons, such as changing business needs, information technology requirements, or to address other issues. Cada cambio produce una nueva versión del servicio.Each change introduces a new version of the service. En este tema se explica cómo considerar el control de versiones en Windows Communication Foundation (WCF).This topic explains how to consider versioning in Windows Communication Foundation (WCF).

Cuatro categorías de cambios del servicioFour Categories of Service Changes

Los cambios en los servicios que se pueden requerir pueden clasificarse en cuatro categorías:The changes to services that may be required can be classified into four categories:

  • Cambios del contrato: por ejemplo, se podría agregar una operación o se podría agregar o cambiar un elemento de datos en un mensaje.Contract changes: For example, an operation might be added, or a data element in a message might be added or changed.

  • Cambios de la dirección: por ejemplo, se mueve un servicio a una ubicación diferente donde los puntos de conexión tienen nuevas direcciones.Address changes: For example, a service moves to a different location where endpoints have new addresses.

  • Cambios del enlace: por ejemplo, un mecanismo de seguridad cambia o lo hace su configuración.Binding changes: For example, a security mechanism changes or its settings change.

  • Cambios de implementación: por ejemplo, cuando cambia una implementación de método interno.Implementation changes: For example, when an internal method implementation changes.

Algunos de estos cambios se denominan "con interrupción" y otros son denominados "sin interrupción".Some of these changes are called "breaking" and others are "nonbreaking." Un cambio no se rompe si todos los mensajes que se habrían procesado correctamente en la versión anterior se procesan correctamente en la nueva versión.A change is nonbreaking if all messages that would have been processed successfully in the previous version are processed successfully in the new version. Cualquier cambio que no cumpla ese criterio es un cambio importante.Any change that does not meet that criterion is a breaking change.

Orientación del servicio y control de las versionesService Orientation and Versioning

Uno de los principios de orientación del servicio es que los servicios y los clientes son autónomos (o independientes).One of the tenets of service orientation is that services and clients are autonomous (or independent). Entre otras cosas, esto implica que los programadores del servicio no pueden suponer que controlan o que incluso lo saben todo sobre los clientes del servicio.Among other things, this implies that service developers cannot assume that they control or even know about all service clients. Esto elimina la opción de recompilar y volver a implementar todos los clientes cuando un servicio cambia de versión.This eliminates the option of rebuilding and redeploying all clients when a service changes versions. En este tema se supone que el servicio se adhiere a este principio de orientación y, por consiguiente, su modificación o el "control de versiones" tiene lugar con independencia de los clientes.This topic assumes the service adheres to this tenet and therefore must be changed or "versioned" independent of its clients.

En los casos en los que no se prevé un cambio con interrupción y no puede evitarse, una aplicación puede decidir si omitir este principio y requerir que los clientes se recompilen y se implementen de nuevo con una nueva versión del servicio.In cases where a breaking change is unexpected and cannot be avoided, an application may choose to ignore this tenet and require that clients be rebuilt and redeployed with a new version of the service.

Versiones de contratosContract Versioning

Los contratos utilizados por un cliente no tienen por qué ser iguales que el contrato utilizado por el servicio; solo deben ser compatibles.Contracts used by a client do not need to be the same as the contract used by the service; they need only to be compatible.

Para los contratos de servicios, la compatibilidad significa que se pueden agregar nuevas operaciones expuestas por el servicio pero que no se pueden quitar o cambiar semánticamente las operaciones existentes en el contrato.For service contracts, compatibility means new operations exposed by the service can be added but existing operations cannot be removed or changed semantically.

Para los contratos de datos, la compatibilidad significa que se pueden agregar las nuevas definiciones de tipo de esquema pero las definiciones existentes de tipo de esquema no se pueden cambiar con interrupción.For data contracts, compatibility means new schema type definitions can be added but existing schema type definitions cannot be changed in breaking ways. Los cambios con interrupción podrían incluir quitar los miembros de datos o cambiar de manera incompatible su tipo de datos.Breaking changes might include removing data members or changing their data type incompatibly. Esta característica da alguna libertad al servicio para cambiar la versión de sus contratos sin interrumpir a los clientes.This feature allows the service some latitude in changing the version of its contracts without breaking clients. Las dos secciones siguientes explican los cambios de no interrupción y de interrupción que se pueden realizar en los contratos de servicio y datos de WCF.The next two sections explain nonbreaking and breaking changes that can be made to WCF data and service contracts.

Versiones de contratos de datosData Contract Versioning

Esta sección trata de datos que controlan las versiones al utilizar las clases DataContractSerializer y DataContractAttribute.This section deals with data versioning when using the DataContractSerializer and DataContractAttribute classes.

Control estricto de las versionesStrict Versioning

En muchos escenarios el cambio de versiones es un problema, el programador del servicio no tiene el control sobre los clientes y, por consiguiente, no puede suponer cómo reaccionarían a los cambios en el mensaje XML o esquema.In many scenarios when changing versions is an issue, the service developer does not have control over the clients and therefore cannot make assumptions about how they would react to changes in the message XML or schema. En estos casos, debe garantizar que los nuevos mensajes se validarán ante el esquema anterior, por dos razones:In these cases, you must guarantee that the new messages will validate against the old schema, for two reasons:

  • Los clientes anteriores se desarrollaron suponiendo que el esquema no cambiaría.The old clients were developed with the assumption that the schema will not change. No pueden procesar mensajes para los que nunca estuvieron diseñados.They may fail to process messages that they were never designed for.

  • Los clientes anteriores pueden realizar la validación del esquema real en el esquema anterior antes de intentar, incluso, procesar los mensajes.The old clients may perform actual schema validation against the old schema before even attempting to process the messages.

El enfoque recomendado en tales escenarios es tratar los existentes contratos de datos como inmutables y crear nuevos contratos con nombres completos y únicos en XML.The recommended approach in such scenarios is to treat existing data contracts as immutable and create new ones with unique XML qualified names. El programador del servicio agregaría a continuación los nuevos métodos a un contrato de servicios existente o crearía un nuevo contrato de servicios con métodos que utilizan el nuevo contrato de datos.The service developer would then either add new methods to an existing service contract or create a new service contract with methods that use the new data contract.

A menudo se dará el caso de que un programador del servicio necesite escribir alguna lógica empresarial que se debería ejecutar dentro de todas las versiones de un contrato de datos más el código empresarial específico para cada versión del contrato de datos.It will often be the case that a service developer needs to write some business logic that should run within all versions of a data contract plus version-specific business code for each version of the data contract. El apéndice que se encuentra al final de este tema explica cómo se pueden utilizar las interfaces para satisfacer esta necesidad.The appendix at the end of this topic explains how interfaces can be used to satisfy this need.

Control de versiones laxLax Versioning

En muchos otros escenarios, el programador del servicio puede suponer que al agregar un nuevo miembro opcional al contrato de datos no se interrumpirán los clientes existentes.In many other scenarios, the service developer can make the assumption that adding a new, optional member to the data contract will not break existing clients. Esto exige al programador del servicio que investigue si los clientes existentes no realizan una validación del esquema y que si omiten a los miembros de datos desconocidos.This requires the service developer to investigate whether existing clients are not performing schema validation and that they ignore unknown data members. En estos escenarios, es posible aprovecharse de las características del contrato de datos para agregar los nuevos miembros sin interrupción.In these scenarios, it is possible to take advantage of data contract features for adding new members in a nonbreaking way. El programador del servicio puede hacer esta suposición con confianza si las características del contrato de datos para controlar las versiones ya se utilizaron para la primera versión del servicio.The service developer can make this assumption with confidence if the data contract features for versioning were already used for the first version of the service.

WCF, ASP.NET Web Services y muchas otras pilas de servicios web admiten el control de versiones laxo: es decir, no producen excepciones para los nuevos miembros de datos desconocidos en los datos recibidos.WCF, ASP.NET Web Services, and many other Web service stacks support lax versioning: that is, they do not throw exceptions for new unknown data members in received data.

Es fácil creer erróneamente que al agregar un nuevo miembro no se interrumpirán los clientes existentes.It is easy to mistakenly believe that adding a new member will not break existing clients. Si no está seguro de que todos los clientes puedan controlar el control lax de versiones, la recomendación es utilizar las instrucciones del control estricto de las versiones y tratar los contratos de datos como inmutables.If you are unsure that all clients can handle lax versioning, the recommendation is to use the strict versioning guidelines and treat data contracts as immutable.

Para obtener instrucciones detalladas para el control de versiones de datos tanto laxos como estrictos, consulte Prácticas recomendadas: controlde versiones de contratos de datos .For detailed guidelines for both lax and strict versioning of data contracts, see Best Practices: Data Contract Versioning.

Distinguir entre los tipos de contrato de datos y .NETDistinguishing Between Data Contract and .NET Types

Una clase o estructura .NET se puede proyectar como un contrato de datos aplicando el atributo DataContractAttribute a la clase.A .NET class or structure can be projected as a data contract by applying the DataContractAttribute attribute to the class. El tipo .NET y sus proyecciones del contrato de datos son dos cuestiones distintas.The .NET type and its data contract projections are two distinct matters. Es posible tener varios tipos .NET con la misma proyección del contrato de datos.It is possible to have multiple .NET types with the same data contract projection. Esta distinción es especialmente útil para permitirle cambiar el tipo .NET mientras mantiene el contrato de datos proyectado, manteniendo así eso la compatibilidad con clientes existentes en el sentido estricto de la palabra.This distinction is especially useful in allowing you to change the .NET type while maintaining the projected data contract, thereby maintaining compatibility with existing clients even in the strict sense of the word. Hay dos cosas que siempre debería hacer para mantener esta distinción entre tipo .NET y contrato de datos:There are two things you should always do to maintain this distinction between .NET type and data contract:

  • Especifique Name y Namespace.Specify a Name and Namespace. Siempre debería especificar el nombre y espacio de nombres de su contrato de datos para evitar que el nombre y espacio de nombres de su tipo .NET se expongan en el contrato.You should always specify the name and namespace of your data contract to prevent your .NET type’s name and namespace from being exposed in the contract. Así, si más tarde decide cambiar el espacio de nombres o nombre de tipo de .NET, el contrato de datos se mantiene invariable.This way, if you decide later to change the .NET namespace or type name, your data contract remains the same.

  • Especifique Name.Specify Name. Siempre debería especificar el nombre de sus miembros de datos para evitar que su nombre de miembro de .NET se exponga en el contrato.You should always specify the name of your data members to prevent your .NET member name from being exposed in the contract. Esta manera, si más tarde decide cambiar el nombre de .NET del miembro, su contrato de datos seguirá siendo el mismo.This way, if you decide later to change the .NET name of the member, your data contract remains the same.

Cambiar o quitar los miembrosChanging or Removing Members

Cambiar el nombre o el tipo de datos de un miembro, o quitar los miembros de datos se considera un cambio con interrupción, aun cuando se permite un control poco estricto de las versiones.Changing the name or data type of a member, or removing data members is a breaking change even if lax versioning is allowed. Si es necesario, cree un nuevo contrato de datos.If this is necessary, create a new data contract.

Si la compatibilidad del servicio es de importancia elevada, podría considerar omitir los miembros de datos no usados en su código y dejarlos en su lugar.If service compatibility is of high importance, you might consider ignoring unused data members in your code and leave them in place. Si se divide un miembro de datos en varios miembros, se podría optar por dejar el miembro existente como una propiedad que pueda realizar la división necesaria y volver a agregar los clientes de nivel inferior (clientes que no se han actualizado a la última versión).If you are splitting up a data member into multiple members, you might consider leaving the existing member in place as a property that can perform the required splitting and re-aggregation for down-level clients (clients that are not upgraded to the latest version).

De igual forma, los cambios realizados al nombre del contrato de datos o al espacio de nombres son cambios con interrupción.Similarly, changes to the data contract’s name or namespace are breaking changes.

Ida y vuelta de datos desconocidosRound-Trips of Unknown Data

En algunos escenarios, hay una necesidad de realizar una "ida y vuelta" de datos desconocidos que proceden de los miembros agregados en una nueva versión.In some scenarios, there is a need to "round-trip" unknown data that comes from members added in a new version. Por ejemplo, un servicio de "versionNew" envía los datos con algunos miembros agregados recientemente a un cliente de "versionOld".For example, a "versionNew" service sends data with some newly added members to a "versionOld" client. El cliente omite los miembros recientemente agregados al procesar el mensaje, pero reenvía esos mismos datos, incluso los miembros agregados recientemente, de vuelta al servicio de versionNew.The client ignores the newly added members when processing the message, but it resends that same data, including the newly added members, back to the versionNew service. El escenario típico para esto son las actualizaciones de datos donde los datos se recuperan del servicio, se cambian y se devuelven.The typical scenario for this is data updates where data is retrieved from the service, changed, and returned.

Para habilitar el round-tripping para un tipo determinado, el tipo debe implementar la interfaz IExtensibleDataObject.To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. La interfaz contiene una propiedad, ExtensionData que devuelve el tipo ExtensionDataObject.The interface contains one property, ExtensionData that returns the ExtensionDataObject type. La propiedad se utiliza para almacenar cualquier dato de las versiones futuras del contrato de datos que es desconocido para la versión actual.The property is used to store any data from future versions of the data contract that is unknown to the current version. Estos datos son opacos para el cliente, pero cuando se serializa la instancia, el contenido de la propiedad ExtensionData se escribe con el resto de los datos de los miembros del contrato de datos.This data is opaque to the client, but when the instance is serialized, the content of the ExtensionData property is written with the rest of the data contract members' data.

Se recomienda que todos sus tipos implementen esta interfaz para alojar los nuevos y desconocidos miembros futuros.It is recommended that all your types implement this interface to accommodate new and unknown future members.

Bibliotecas de contratos de datosData Contract Libraries

Puede haber bibliotecas de contratos de datos donde un contrato se publica en un repositorio central y el servicio e implementadores de tipo implementan y exponen los contratos de datos de ese repositorio.There may be libraries of data contracts where a contract is published to a central repository, and service and type implementers implement and expose data contracts from that repository. En ese caso, al publicar un contrato de datos en el repositorio, no tiene ningún control sobre quién crea tipos que lo implementan.In that case, when you publish a data contract to the repository, you have no control over who creates types that implement it. Por lo tanto, no puede modificar el contrato una vez publicado, por lo que se representa inmutable de manera efectiva.Thus, you cannot modify the contract once it is published, rendering it effectively immutable.

Al utilizar XmlSerializerWhen Using the XmlSerializer

Se aplican los mismos principios de control de versiones al utilizar la clase XmlSerializer.The same versioning principles apply when using the XmlSerializer class. Cuando se requiere la versión estricta se requiere, trata los contratos de datos como inmutables y crea los nuevos contratos de datos con nombres únicos y completos para las nuevas versiones.When strict versioning is required, treat data contracts as immutable and create new data contracts with unique, qualified names for the new versions. Al estar seguro de que se puede utilizar el control lax para las versiones, puede agregar los nuevos miembros serializables en las nuevas versiones pero no puede cambiar o quitar los miembros existentes.When you are sure that lax versioning can be used, you can add new serializable members in new versions but not change or remove existing members.

Nota

XmlSerializer utiliza XmlAnyElementAttribute y los atributos XmlAnyAttributeAttribute para admitir viajes de ida y vuelta de los datos desconocidos.The XmlSerializer uses the XmlAnyElementAttribute and XmlAnyAttributeAttribute attributes to support round-tripping of unknown data.

Versiones de contratos de mensajeMessage Contract Versioning

Las instrucciones para las versiones de contrato de mensaje son muy similares al control de las versiones de los contratos de datos.The guidelines for message contract versioning are very similar to versioning data contracts. Si se requiere el control estricto de las versiones, no debería cambiar el cuerpo de su mensaje pero, en su lugar, debería crear un nuevo contrato de mensaje con un nombre único y completo.If strict versioning is required, you should not change your message body but instead create a new message contract with a unique qualified name. Si sabe que puede utilizar el control lax de las versiones, puede agregar nuevas piezas del cuerpo del mensaje pero no puede cambiar o quitar las existentes.If you know that you can use lax versioning, you can add new message body parts but not change or remove existing ones. Esta orientación se aplica tanto a los contratos de mensaje sencillos como a los ajustados.This guidance applies both to bare and wrapped message contracts.

Se pueden agregar los encabezados del mensaje siempre, aun cuando el control estricto de versiones esté en uso.Message headers can always be added, even if strict versioning is in use. La marca MustUnderstand puede afectar a las versiones.The MustUnderstand flag may affect versioning. En general, el modelo de control de versiones para encabezados en WCF es como se describe en la especificación SOAP.In general, the versioning model for headers in WCF is as described in the SOAP specification.

Control de las versiones del contrato de serviciosService Contract Versioning

De manera parecida al control de las versiones del contrato de datos, el contrato de servicios que también controla las versiones implica agregar, cambiar y quitar operaciones.Similar to data contract versioning, service contract versioning also involves adding, changing, and removing operations.

Especificar nombre, espacio de nombres y acciónSpecifying Name, Namespace, and Action

De forma predeterminada, el nombre de un contrato de servicios es el nombre de la interfaz.By default, the name of a service contract is the name of the interface. Su espacio dehttp://tempuri.orgnombres predeterminado es " ", y la acción de cada operación es "http://tempuri.org/contractname/methodname".Its default namespace is "http://tempuri.org", and each operation’s action is "http://tempuri.org/contractname/methodname". Se recomienda especificar explícitamente un nombre y un espacio de nombres para elhttp://tempuri.orgcontrato de servicio y una acción para cada operación para evitar el uso de " " y evitar que los nombres de interfaz y método se expongan en el contrato del servicio.It is recommended that you explicitly specify a name and namespace for the service contract, and an action for each operation to avoid using "http://tempuri.org" and to prevent interface and method names from being exposed in the service’s contract.

Agregar parámetros y operacionesAdding Parameters and Operations

Agregar operaciones del servicio expuestas por el servicio es un cambio sin interrupción porque los clientes existentes no necesitan ocuparse de esas nuevas operaciones.Adding service operations exposed by the service is a nonbreaking change because existing clients need not be concerned about those new operations.

Nota

Agregar las operaciones a un contrato de devolución de llamada dúplex es un cambio con interrupción.Adding operations to a duplex callback contract is a breaking change.

Cambiar el parámetro de operación o los tipos de valor devueltoChanging Operation Parameter or Return Types

Cambiar el parámetro o los tipos de valor devuelto generalmente comportan un cambio con interrupción a menos que el nuevo tipo implemente el mismo contrato de datos implementado por el tipo anterior.Changing parameter or return types generally is a breaking change unless the new type implements the same data contract implemented by the old type. Para realizar este cambio, agregue una nueva operación al contrato de servicios o defina un nuevo contrato de servicios.To make such a change, add a new operation to the service contract or define a new service contract.

Quitar operacionesRemoving Operations

Quitar las operaciones también es un cambio con interrupción.Removing operations is also a breaking change. Para realizar este cambio, defina un nuevo contrato de servicios y expóngalo en un nuevo extremo.To make such a change, define a new service contract and expose it on a new endpoint.

Contrato de errorFault Contracts

El atributo FaultContractAttribute permite que a un programador del contrato de servicios especifique la información sobre los errores que pueden devolver las operaciones del contrato.The FaultContractAttribute attribute enables a service contract developer to specify information about faults that can be returned from the contract's operations.

La lista de errores descrita en el contrato de un servicio no se considera exhaustiva.The list of faults described in a service's contract is not considered exhaustive. En cualquier momento, una operación puede devolver errores que no se describen en su contrato.At any time, an operation may return faults that are not described in its contract. Cambiar, por consiguiente, el conjunto de errores descrito en el contrato no se considerado como con interrupción.Therefore changing the set of faults described in the contract is not considered breaking. Por ejemplo, agregar un nuevo error al contrato utilizando FaultContractAttribute o quitando un error existente del contrato.For example, adding a new fault to the contract using the FaultContractAttribute or removing an existing fault from the contract.

Bibliotecas de contratos de serviciosService Contract Libraries

Las organizaciones pueden tener bibliotecas de contratos donde un contrato se publica en un repositorio central y los implementadores de servicio y repositorio implementan los contratos desde ese repositorio.Organizations may have libraries of contracts where a contract is published to a central repository and service implementers implement contracts from that repository. En este caso, al publicar un contrato de servicios en el repositorio, no tiene ningún control sobre quién crea servicios que lo implementan.In this case, when you publish a service contract to the repository you have no control over who creates services that implement it. Por tanto, no puede modificar el contrato de servicio una vez publicado, por lo que se presenta inmutable de manera efectiva.Therefore, you cannot modify the service contract once published, rendering it effectively immutable. WCF admite la herencia de contratos, que se puede usar para crear un nuevo contrato que extiende los contratos existentes.WCF supports contract inheritance, which can be used to create a new contract that extends existing contracts. Para utilizar esta característica, defina una nueva interfaz del contrato de servicios que se hereda de la interfaz del contrato de servicios anterior y, a continuación, agregue los métodos a la nueva interfaz.To use this feature, define a new service contract interface that inherits from the old service contract interface, then add methods to the new interface. Cambia, a continuación, el servicio que implementa el contrato anterior para implementar el nuevo contrato y cambiar la definición de extremo de "versionOld" para utilizar el nuevo contrato.You then change the service that implements the old contract to implement the new contract and change the "versionOld" endpoint definition to use the new contract. Para los clientes de "versionOld", el punto de conexión continuará apareciendo como si se expusiera el contrato de "versionOld"; para los clientes de "versionNew", el punto de conexión aparecerá para exponer el contrato de "versionNew."To "versionOld" clients, the endpoint will continue to appear as exposing the "versionOld" contract; to "versionNew" clients, the endpoint will appear to expose the "versionNew" contract.

Dirección y enlace de las versionesAddress and Binding Versioning

Los cambios de la dirección del extremo y enlace son cambios con interrupción a menos que los clientes sean capaces de detectar dinámicamente la nueva dirección del extremo o enlace.Changes to endpoint address and binding are breaking changes unless clients are capable of dynamically discovering the new endpoint address or binding. Un mecanismo para implementar esta función consiste en utilizar un registro de la Descripción e integración de la detección universal (UDDI) y el patrón de invocación UDDI donde un cliente intenta comunicar con un punto de conexión y, en cuando se produce un error, consulta los metadatos del punto de conexión actual en un registro de UDDI conocido.One mechanism for implementing this capability is by using a Universal Discovery Description and Integration (UDDI) registry and the UDDI Invocation Pattern where a client attempts to communicate with an endpoint and, upon failure, queries a well-known UDDI registry for the current endpoint metadata. El cliente utiliza a continuación la dirección y el enlace desde estos metadatos para comunicarse con el extremo.The client then uses the address and binding from this metadata to communicate with the endpoint. Si esta comunicación se realiza con éxito, el cliente almacena en caché la dirección e información de enlace para su uso en el futuro.If this communication succeeds, the client caches the address and binding information for future use.

Servicio de enrutamiento y control de versionesRouting Service and Versioning

Si los cambios realizados en un servicio son cambios importantes y es necesario crear dos o más versiones diferentes de un servicio que se ejecuta simultáneamente, puede utilizar el servicio de enrutamiento de WCF para enrutar los mensajes a la instancia del servicio adecuada.If the changes made to a service are breaking changes and you need to have two or more different versions of a service running simultaneously you can use the WCF Routing Service to route messages to the appropriate service instance. El Servicio de enrutamiento de WCF usa enrutamiento basado en el contenido; es decir, usa información contenida en el mensaje para determinar dónde enrutarlo.The WCF Routing Service uses content-based routing, in other words, it uses information within the message to determine where to route the message. Para obtener más información sobre el servicio de enrutamiento WCF, vea Servicio de enrutamiento.For more information about the WCF Routing Service see Routing Service. Para obtener un ejemplo de cómo usar el servicio de enrutamiento WCF para el control de versiones de servicio, vea Cómo: control de versionesde servicio .For an example of how to use the WCF Routing Service for service versioning see How To: Service Versioning.

ApéndiceAppendix

La recomendación general para el control de versiones de los contratos de datos es que cuando se necesite un control estricto de las versiones los contratos de datos se traten como inmutables y crear otros nuevos cuando se requieran cambios.The general data contract versioning guidance when strict versioning is needed is to treat data contracts as immutable and create new ones when changes are required. Se necesita crear una nueva clase para cada nuevo contrato de datos, por lo que necesita que un mecanismo evite tener que tomar código existente, que se escribió referido a la clase del contrato de datos antiguo y volverlo a escribir, referido a la nueva clase del contrato de datos.A new class needs to be created for each new data contract, so a mechanism is needed to avoid having to take existing code that was written in terms of the old data contract class and rewrite it in terms of the new data contract class.

Dicho mecanismo se utiliza en interfaces para definir los miembros de cada contrato de datos y escribir el código de implementación interno, referido a las interfaces en lugar de referirse a las clases del contrato de datos que implementan las interfaces.One such mechanism is to use interfaces to define the members of each data contract and write internal implementation code in terms of the interfaces rather than the data contract classes that implement the interfaces. El código siguiente para la versión 1 de un servicio muestra una interfaz IPurchaseOrderV1 y PurchaseOrderV1:The following code for version 1 of a service shows an IPurchaseOrderV1 interface and a PurchaseOrderV1:

public interface IPurchaseOrderV1  
{  
    string OrderId { get; set; }  
    string CustomerId { get; set; }  
}  
  
[DataContract(  
Name = "PurchaseOrder",  
Namespace = "http://examples.microsoft.com/WCF/2005/10/PurchaseOrder")]  
public class PurchaseOrderV1 : IPurchaseOrderV1  
{  
    [DataMember(...)]  
    public string OrderId {...}  
    [DataMember(...)]  
    public string CustomerId {...}  
}  

Aunque las operaciones del contrato de servicios se escriban referidas a PurchaseOrderV1, la lógica empresarial real se referiría a IPurchaseOrderV1.While the service contract’s operations would be written in terms of PurchaseOrderV1, the actual business logic would be in terms of IPurchaseOrderV1. En la versión 2 habría, como se muestra a continuación, una nueva interfaz IPurchaseOrderV2 y una nueva clase PurchaseOrderV2 en el código siguiente:Then, in version 2, there would be a new IPurchaseOrderV2 interface and a new PurchaseOrderV2 class as shown in the following code:

public interface IPurchaseOrderV2  
{  
    DateTime OrderDate { get; set; }  
}

[DataContract(
Name = "PurchaseOrder",  
Namespace = "http://examples.microsoft.com/WCF/2006/02/PurchaseOrder")]  
public class PurchaseOrderV2 : IPurchaseOrderV1, IPurchaseOrderV2  
{  
    [DataMember(...)]  
    public string OrderId {...}  
    [DataMember(...)]  
    public string CustomerId {...}  
    [DataMember(...)]  
    public DateTime OrderDate { ... }  
}  

El contrato de servicios se actualizaría para incluir las nuevas operaciones que se escriben referidas a PurchaseOrderV2.The service contract would be updated to include new operations that are written in terms of PurchaseOrderV2. La lógica empresarial existente, escrita referida a IPurchaseOrderV1 seguiría funcionando para PurchaseOrderV2 y la nueva lógica empresarial que necesita la propiedad OrderDate se escribiría referida a IPurchaseOrderV2.Existing business logic written in terms of IPurchaseOrderV1 would continue to work for PurchaseOrderV2 and new business logic that needs the OrderDate property would be written in terms of IPurchaseOrderV2.

Consulte tambiénSee also