2008-11-21 16 views
19

Estoy experimentando con WCF Services, y me he encontrado con un problema al pasar las interfaces.¿Interfaz de paso en un servicio de WCF?

Esto funciona:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    string GetString(); 
} 

pero esto no es así:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Cuando intento compilar el cliente se produce un error en el método GetInterface. Recibo una excepción que dice que no puede convertir Object a IDevice.

En el lado del cliente, la clase IHomeService implementa correctamente GetString con una cadena, ya que es returntype, pero GetInterface tiene un tipo de objeto retornado. ¿Por qué no es IDevice?

Respuesta

20

tiene que decirle a la serializador WCF qué clase de utilizar para serializar la interfaz

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Lo siento, pero creo que no entiendo. Digamos que quiero que el método GetInterface devuelva dos clases diferentes, SimpleDevice y AdvancedDevice, ambas implementan la interfaz IDevice. ¿Debo entonces configurar ServiceKnownType para ambos tipos? –

+1

Al deserializar, ¿cómo sabe WCF qué tipo de implementación de IHomeService usar? – Will

+1

Sí, creo que lo tienes. Le está diciendo a WCF los posibles tipos que implementan la interfaz. Puede pasar cualquier tipo, siempre que WCF sepa que estos tipos conocidos implementan la interfaz y que sean serializables. –

9

Gracias, funciona cuando cambié de esta manera:

[ServiceContract] 
[ServiceKnownType(typeof(PhotoCamera))] 
[ServiceKnownType(typeof(TemperatureSensor))] 
[ServiceKnownType(typeof(DeviceBase))] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

También me dio la ayuda de este sitio: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

+0

¡Gracias por ese ejemplo! –

+1

El enlace ahora es 404, pero algunos motores de búsqueda lo tienen en la memoria caché – noonand

+0

Frode: ¿No crees que @Brian realmente respondió tu pregunta? –

1

Inicialmente intenté pasar una interfaz a un método WCF pero no pude hacer que el código funcionara con las respuestas proporcionadas en este hilo. Al final refactoré mi código y pasé una clase abstracta al método en lugar de una interfaz. Lo hice funcionar utilizando el atributo KnownType en la clase base, p.

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData