WCF e interfaces en contratos de datos

Al crear el proxy WCF utilizando svcutil, ¿es posible incluir también las interfaces de las que los contratos de datos heredan, por ejemplo:

public class SomeType: ISometype { public string Name { get; set; } } public interface ISometype { public string Name { get; set; } } 

Cuando creo el proxy usando esto, el tipo SomeType se crea en el cliente pero la interfaz no se crea y tampoco hay herencia. Intenté marcar la interfaz como DataContract, pero ese atributo no está permitido.

¿Es posible hacer lo que estoy tratando de hacer?

WCF utiliza mensajería serializada, y todos esos mensajes deben poder ser serializados usando un DataContractSerializer o un XmlSerializer. Y esos mensajes que van entre el cliente y el servidor deben poder expressse en el esquema XML.

Ahora, el esquema XML no sabe nada acerca de las interfaces: se trata de tipos reales y concretos. Para un escenario habitual en el que sus clientes pueden ser cualquier cosa, desde .NET hasta PHP o Ruby (lo que sea), debe asegurarse de express todo lo que desea enviar entre el cliente y el servidor de una manera que pueda representarse en el esquema XML: interfaces no poder. Entonces, realmente no hay forma de respaldar esto en un escenario de propósito general.

Si está controlando ambos extremos del cable, por ejemplo, escribe tanto el cliente como el servidor, y ambos en .NET, puede hacer esto:

  • ponga sus DataContracts (y sus ServiceContracts y OperationContracts y FaultContracts) en un conjunto separado MyServiceContracts

  • haga referencia a ese ensamblaje tanto desde el código del lado del servicio, como desde el del cliente. En ese caso, cuando vaya a crear el proxy del cliente, los tipos que menciona ya están presentes y WCF reutilizará dichos tipos de ese ensamblaje. Y dado que se trata de un ensamblado .NET al que hace referencia, puede tener cualquier cosa allí que sea compatible con .NET, incluidas las interfaces.

Puede heredar de la clase que implementa ISometype y agregarlo a serialización utilizando el atributo KnownType:

¿Puedo forzar a svcutil.exe a generar contratos de datos para un servicio WCF?