2012-02-24 11 views
8

¿Cómo puedo pasar una lista de tipos complejos en ServiceStack? Por ejemplo, mi Solicitud DTO se ve así:¿Cómo pasar la lista de tipos complejos en la cadena de consulta?

//Request DTO 
public class Test 
{ 
    public IList<Fund> Funds { get; set; } 
} 

public class Fund 
{ 
    public string Key { get; set; } 
    public int Percent { get; set; } 
} 

¿Cómo puedo pasar el objeto serializado a través de HTTP get?

http://localhost:49490/api/funds={ ?? } 

KeyValueDataContractDeserializer: Error al convertir a escribir: Definiciones de tipos deben comenzar con un '{' cadena, esperando serializado 'Fondo' tipo, conseguido a partir de: asdf

Respuesta

10

ServiceStack analiza la cadena de consulta utilizando el JSV Format esto es básicamente JSON con las comillas estilo CSV (es decir, solo necesita comillas cuando su valor tiene un carácter de escape).

Aunque no se ha definido una ruta personalizada aquí, en la mayoría de los casos la ruta personalizada es la misma que su solicitud DTO que en este caso es prueba no /fondos.

Así que asumiendo una ruta personalizada parece:

Routes.Add<Test>("/test"); 

Puede llamar a su servicio a través de una cadena de consulta como:

http: // localhost: 49490/API/prueba de fondos = [{clave? : Key1, Porcentaje: 1}, {Key: Key2, Percent: 2}]

En una nota lateral Las interfaces en DTO son generalmente una mala idea, debe considerar evitar (al menos limitar) su uso en todo momento.

+0

Gracias, funciona mejor! ¿Qué quiere decir exactamente con "Las interfaces en DTO son generalmente una mala idea"? ¿Cómo lo aprobaría/diseñaría en este caso? –

+4

Quitaría el I de IList, es decir, solo tengo List. Si no proporciona tipos concretos, los pocos serializadores que realmente admiten interfaces tienen que emitir información de tipo dinámico en el cable, lo que aumenta innecesariamente la carga útil y acopla el formato a la impl del serializador. Tampoco hay razones válidas/válidas para tener interfaces en DTO. – mythz

Cuestiones relacionadas