2011-01-18 9 views
13

Al crear el proxy WCF utilizando svcutil, es posible incluir las interfaces, así de la que los contratos de datos heredan, por ejemplo:WCF y las interfaces en los datos contratos

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

public interface ISometype 
{ 
    public string Name { get; set; } 
} 

Cuando creo el proxy utilizando 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?

Respuesta

21

WCF utiliza mensajes en serie, y todos esos mensajes tienen que ser capaces de ser serializado usando un DataContractSerializer o un XmlSerializer. Y esos mensajes que van entre el cliente y el servidor deben poder expresarse 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 expresar 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, p. se escribe el cliente y el servidor, y tanto en .NET, entonces usted puede hacer esto:

  • poner sus DataContracts (y sus ServiceContracts y OperationContracts y FaultContracts) todo en un ensamblado independiente MyServiceContracts

  • hace 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á esos 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.

+0

Gracias marc_s Voy a probar este enfoque. – ganeshran

+0

Gracias por la explicación marc_s, supongo que Ganeshran está considerando un caso similar para mí. El objetivo no es pasar una instancia de foo que implementa ISometype al servidor a través de métodos de servicio, lo que me gustaría hacer es evitar dependencias concretas en el consumidor del servicio; sin tener que replicar todos los objetos en otra capa y tener un mapeo interminable (Automapper u otro), el servicio que estoy consumiendo tiene cientos de tipos y miles de atributos. – RobD

Cuestiones relacionadas