Llevamos viendo desde hace ya un tiempo algunas de las características de RIA Services, una tecnología que me parece bastante interesante y aprovechable.
En esta ocasión toca ver unas de las novedades de la última versión de julio, que es cómo se puede integrar con RIA Services con ADO.NET Data Service.
Como ya vimos en un post anterior la arquitectura de una aplicación RIA Services podría ser la siguiente:
Se pueden ver ver dos componentes que aporta RIA Services, uno en la parte cliente ( DomainContext ) y otro en la parte servidora ( DomainService ), que se comunican a través de la red; red local, internet…
En lugar de tener un sistema propio de comunicación entre ambos componentes, una alternativa lógica puede ser usar una ya existente, como ADO.NET Data Service, una tecnología que nos permite definir servicios de datos de tipo RESTFull sobre un cierto modelo de datos, basándose en mecanismos y tecnologías a las que se está habituado, como el uso de URLs, XML o JSON.
En esta primera versión, partiendo de una aplicación hecha con RIA Services, vamos a poder exponer el componente servidor ( DomainService ) a través de ADO.NET Data Services y consumirlo desde el cliente con prácticamente ningún cambio.
En este ejemplo partiremos de una aplicación de ejemplo que usa la base de datos adventureworks y que muestra en un grid de Silverlight la tabla de productos. La aplicación RIA la haríamos siguiendo los pasos que hemos visto en post anteriores.
Una vez que tenemos la aplicación funcionando, tendremos que añadir un nuevo item al proyecto web, un item de tipo “Domain ADO.NET Data Service”.
Una vez creado el servicio de ADO.NET Data Services le tenemos que indicar cuál va a ser el origen de datos sobre el que va a trabajar el servicio. En este caso, el origen de datos tiene que ser nuestro servicio de RIA Services, el componente DomainService.
public class EmployeeDataService : DataService<ProductService>, IServiceProvider
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(IDataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
// Examples:
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}
Fijaros, para los que conocéis ADO.NET Data Services, que el funcionamiento es exactamente igual al que había hasta ahora, con la única diferencia de que hay que indica el componente DomainService de RIA Services, en lugar de un modelo de datos de EF o LINQ to SQL.
Una vez hecho esto, tendremos que hacer un paso más en el DomainService, para que desde el cliente pueda ser consumido.
Añadimos la referencia:
using System.Data.Services.Providers.DomainService;
Y junto al atributo [EnableClientAccess] añadimos este otro:
[DomainIdentifier("Atom", CodeProcessor = typeof(AtomCodeProcessor))]
Con estos cambios, ya tenemos nuestro servicio preparado para ser consumido. Si arrancamos el servicio ya podemos hacerle
peticiones REST.
En el proyecto cliente, añadimos las referencias a las librerías System.Windows.Ria.Atom.dll y System.Data.Services.Client.Protocol.dll que se encuentran en: %ProgramFiles%Microsoft SDKsRIA Servicesv1.0LibrariesSilverlight.
Una vez hecho, el código para consumir el servicio quedaría de la siguiente manera:
using System.Windows.Browser;
using System.Data.Services.Client.Protocol;
using System.Windows.Ria.Data;
…………….
ProductDomainContext productContext = new ProductDomainContext(
new AtomDomainClient(
new Uri(HtmlPage.Document.DocumentUri, "ProductService.svc")));
ProductGrid.ItemsSource = productContext.Products;
productContext.Load(productContext.GetProductQuery());
Fijaros, que la diferencia entre consumirlo directamente o a través de ADO.NET Data Services es usar un constructor diferente para el objeto productContext. El resto de funcionalidad es exactamente igual.
De todas maneras, comentar, según comentan en la documentación, que la integración entre RIA Services y ADO.NET Data Services está en una primera fase y que se preveen opciones y alternativas más avanzadas