2010-08-19 20 views
12

Tengo algunas dificultades con los servicios WCF RIA similares al problema especificado en this thread.Ria Services Pasando objeto complejo como parámetro a un método de servicio de dominio de consulta

El método domainservice que estoy creando (un método de consulta) debería tomar un parámetro de objeto complejo. ejemplo método DomainService:

public ComplexObjectResult GetComplexObject(ComplexObjectParameter test) 
    { 
     //do stuff 
    } 

el objeto de parámetro:

public class ComplexObjectParameter 
{   

    [Key] 
    public decimal ID { get; set; } 

    ... other fields 
} 

consigo este error de compilación: Error 70 Parámetro 'test' de entrada de operación de dominio 'GetComplexObject' debe ser uno de los serializable predefinido tipos.

Después de buscar en la web encontré this msdn thread. Indica que esto es una limitación de los servicios de RIA y el hilo no especifica soluciones provisionales decentes.

Ahora parece que hay algunas soluciones sucias:

  • Cambiar el parámetro complejo de tipo cadena y Serialize/deserializar el parameterobject mismos que encuentro una solución poco limpia.

  • Utilice la etiqueta [Invoke] en el método de servicio de dominio y pierda toda la funcionalidad de rastreo de RIA, para la cual estoy usando RIA en primer lugar.

¿Hay alternativas para las soluciones mencionadas que tienen menos desventajas? ¿Alguien ha encontrado una solución más elegante para este problema?

Gracias

+0

Fui con su segunda opción Stephane. Los tipos complejos que devolví fueron de solo lectura en el cliente, por lo que la pérdida de la funcionalidad de seguimiento no fue un problema para mí. Considere poner posibles soluciones (incluso las sucias) en respuestas la próxima vez ... ¡Hubiera votado tanto la pregunta como la respuesta entonces! –

Respuesta

6

sucio de solución tres, es utilizar el atributo [invocación] y añadir un método para el servicio de dominio para exponer el "tipo complejo", que informa al utillaje WCF RIA para crear la entidad en el cliente -side:

public ComplexObjectParameter ExposeComplexObjectParameter() 
{ 
    throw new NotSupportedException(); 
} 

puse NotSupportedException en mis métodos de servicios de dominio para evitar fallos silenciosos si el método se llama cada vez de forma remota.

No estoy seguro de cómo esta solución afecta el problema de perder "toda la funcionalidad de rastreo de RIA". No responde cómo crear una consulta composable utilizando un tipo complejo como parámetro.

Está sucio, pero resuelve el problema más cercano al origen del problema. El código de llamada y recepción es más limpio. Esto mantiene la "elegancia" en el nivel superior mientras empuja el sucio hacia abajo.

+1

Hola, Ed., Ya había creado un método falso de Query para generar el objeto del parámetro complejo generado en el lado del cliente.Es parte de la solución sucia 2. Pero terminé usando otra solución más: persistir el parámetro de objeto complejo en la base de datos, y luego simplemente pasar la identificación al realizar una consulta. Esta solución puede no ser aplicable a todas las personas que experimentan este problema, pero se adapta a mi caso. Gracias por tu esfuerzo. – Stephane

+0

Un voto para explicar que necesita 'exponer' el tipo complejo. –

2

Súper vieja pregunta, lo sé. Pero acabo de entender esto y encontré una respuesta. Desde el MSDN Docs en ComplexObject:

But a ComplexObject differs from an Entity in important ways. In particular, complex types do not have identities. This means that they do not have members marked with the KeyAttribute and so clients cannot do identity caching for them as it does for entities. Complex types cannot be shared or referenced from multiple parent instances and they do not support inheritance.

Cuestiones relacionadas