Para quien no conozca RIA Services, son un conjunto de servicios que mejoran mucho el desarrollo de aplicaciones con Silverlight. Desde el propio equipo la definen así:
Microsoft .NET RIA Services simplifies the traditional n-tier application pattern by bringing together the ASP.NET and Silverlight platforms. RIA Services provides a pattern to write application logic that runs on the mid-tier and controls access to data for queries, changes and custom operations.
Esta gráfica de Nikhil Kothari explica muy bien donde se encuentra los RIA Services.
Las principales ventajas de RIA Services contra otras tecnologías de Servicios presentadas por Microsoft, son su integración con ASP.NET (por temas de autenticación, roles, etc.) como su ligera serialización usando Json.
El principal problema es que está muy centrado en las entidades tanto de la base de datos (Linq to SQL, Entity Framework, etc.) como las que nosotros podamos crear a mano. Centrándose así en las operaciones Add, Update, Delete, Get, etc. de las propias entidades.
El problema nos lo encontramos cuando queremos enviar del cliente al servidor una colección de entidades del servicio (entendamos como entidades del servicio aquellas que se exponen con un método Get, Update, Delete Add, etc.).
Las limitaciones de RIA Services se extienden hasta el punto de que un método solo puede devolver una colección de entidades, una entidad o un tipo serializable “built-in” (como los tipos básicos, el guid y poco más). Y los parámetros del método solo soporta los tipos básicos serializables “built-in” y una entidad.
¡No colecciones!
Para solucionar eso, primero debemos crear un Custom Operation y donde queríamos poner una colección he puesto un objeto serializado en Json. Y así lo serializo antes de llamar al método y justo en el manejador del método en el servicio.
La extension method que he usado para serializar la he publicado en mi proyecto SilverBox, que liberé la semana pasada en CodePlex:
http://silverbox.codeplex.com
Debéis obtener el último commit subido al Source Control y compilar la librería. Luego solo debéis referenciar la librería SilverBox.dll y en el archivo de código añadir la directiva “using SilverBox.Extensions”.
Y los tipos string y object tendrá un método SerializeToJson y Deserialize.