2010-09-15 16 views
9

Tengo un contrato de servicio wcf simple que funciona bien si uso las implementaciones concretas para las interfaces, pero si quiero usar las interfaces en los parámetros en lugar de las clases concretas, me da el error que mostraré a continuación.¿Por qué mis contratos de operación en mi cliente wcf no pueden tomar interfaces como parámetros?

Aquí es código:

[ServiceContract] 
public interface IClientUserRegistration 
{ 
    [OperationContract] 
    void RegisterClientUser(ClientUser clientUser); 

    [OperationContract] 
    List<ClientUser> GetUsers(); 
} 

Si sustituyo ClientUser con IClientUser, el cliente de prueba WCF dice que la operación RegisterClientUser no es compatible, ya que utiliza el tipo System.Object. Si reemplazo el valor de retorno de GetUsers con List, dice que esta operación no es compatible porque usa el tipo System.Object []. ¿Por qué da estos errores?

La razón por la que estaba tratando de usar IClientUser es que podría implementar diferentes tipos de usuarios que implementan la interfaz IClientUser y pasarlos a RegisterClient, pero si solo puedo pasar ClientUser, entonces tengo que crear un montón de Las anulaciones de RegisterClient toman diferentes tipos de usuarios.

Respuesta

13

SOAP no tiene ningún concepto de interfaces. Eso tendería a hacer la deserialización difícil.

+0

Si se trata de un servicio basado en REST, ¿puedo usar interfaces o es el mismo? Soy nuevo en esto, así que perdóname. Respecto a mi otra parte de mi pregunta desde que mencionaste que SOAP no tiene ningún concepto de interfaces. Si quisiera registrar clientes diferentes, ¿tendría que anular el método RegisterClientUser, por ejemplo, RegisterClientUser (SuperUser superUser); – Xaisoft

+3

Sí, es lo mismo independientemente. Imagine intentar hacer una representación XML de TODOS los valores dentro de un objeto, pero solo conoce una pequeña porción de las claves. No podrías completar tu tarea. WCF lo mira de la misma manera. –

+4

Spot on - Las llamadas WCF son llamadas de función ** NOT ** .NET. Son mensajes serializados que se pasan de cliente a servidor (y viceversa) y las interfaces no se prestan a la serialización .... –

11

Esto se debe a que los objetos tienen que ser serializados para pasar entre el cliente y el servidor. No puedes pasar un tipo de "objeto". Todos los tipos deben ser concretos para que puedan serializarse y deserializarse adecuadamente. Una interfaz no es más que un tipo de "objeto" con un subtipo de la interfaz. El objeto como un todo no se puede deserializar y serializar de esta forma, solo pueden ser los miembros de la interfaz. Esto haría una implementación realmente desordenada en ambos lados.

+0

Gracias, le importaría echarle un vistazo a mi comentario a John Saunders. – Xaisoft

Cuestiones relacionadas