El desarrollo de una aplicación Silverlight, además de las ventajas que ofrece en cuanto al tratamiento de video y gráficos se refiere, precisará, con toda probabilidad, de la implementación de una cierta cantidad de operaciones de manipulación contra un origen de datos, pongamos como ejemplo una base de datos SQL Server.

Los retos del desarrollo bajo el modelo RIA

Si aplicamos a nuestro desarrollo un enfoque basado en el modelo RIA, nos encontraremos con que tendremos que realizar un importante esfuerzo de codificación en la creación de un conjunto de servicios y clases, las cuales se ocupen del trasiego de datos entre la interfaz de usuario Silverlight y la fuente de datos situada en el lado servidor del diseño de nuestra aplicación.

Como factor adicional, debemos tener en cuenta que dadas las características de funcionamiento de Silverlight, todos los elementos que forman parte de esta maquinaria deberán de funcionar de modo asíncrono, lo cual introduce un nivel añadido de complejidad al desarrollo de la aplicación.

La llegada de .NET RIA Services a la arena del desarrollo Silverlight, sirve para mitigar la carga de trabajo que el desarrollador debe realizar, ya que se trata de un producto que se ocupa de generar automáticamente las clases y servicios necesarios para estas operaciones de mantenimiento de datos, a partir del modelo de datos que hayamos definido en nuestro proyecto.

Aplicando .NET RIA Services

El mejor modo de ilustrar el uso de .NET RIA Services pasa por realizar un proyecto de ejemplo, en el que paso a paso, podamos ver las fases principales de su creación. Antes de comenzar, resulta necesario resaltar que para trabajar con .NET RIA Services debemos tener instalado  Silverlight 3.

Pongamos como caso que necesitamos desarrollar una página Silverlight, en la que tenemos que visualizar, dentro de un DataGrid, algunas de las columnas de la tabla Orders (perteneciente a la base de datos Northwind), con la particularidad de que en lugar de mostrar todos los registros de la tabla, filtraremos por el campo ShipCountry, visualizando solamente aquellos que tengan un mismo valor para este campo, que previamente el usuario habrá seleccionado mediante un ComboBox, que contendrá la lista de posibles valores.

A la mencionada lista de valores del campo ShipCountry accederemos mediante una vista, que crearemos empleando la siguiente sentencia SQL.

CREATE VIEW PaisesPedidos
AS
SELECT DISTINCT ShipCountry FROM Orders

Una vez creada esta vista dentro de la base de datos Northwind, abriremos Visual Studio 2008 y crearemos un nuevo proyecto de tipo SilverlightApplication, al que daremos el nombre SeleccionComboBox, marcando además, la casilla Enable .NET RIA Services en el cuadro inicial de creación del proyecto.

 

Definición del modelo de datos de la aplicación

El primer paso a dar consistirá en la creación del modelo de datos de la aplicación, para lo cual nos situaremos en el proyecto Web (SeleccionComboBox.Web) de la solución recién creada,  seleccionaremos la opción de menú Project > Add New Item, y dentro de la categoría Data añadiremos un nuevo elemento de tipo LINQ to SQL Classes, al que daremos el nombre Northwind.dbml.

 

 A continuación, desde la ventana Server Explorer, crearemos una nueva conexión contra la base de datos Northwind, completando el diálogo de creación de conexión que se muestra al hacer clic en el icono Connect to Database

 Como resultado, la ventana Server Explorer mostrará la conexión recién creada a partir del nodo Data Connections. Desplegando los nodos correspondientes a las tablas y vistas de esta base de datos, arrastraremos hasta el área de diseño del modelo de datos la tabla Orders y la vista PaisesPedidos. 

 Compilando la solución se generará la clase NorthwindDataContext, que representa al contexto/modelo de datos actualmente reflejado en el diseñador; y las clases Order y PaisesPedido, que identifican respectivamente a la tabla y vista seleccionadas de la base de datos.

DomainService. Creando el servicio de dominio

El siguiente paso consiste en crear el servicio de dominio para la aplicación, por lo que, nuevamente, desde el proyecto Web de la solución, seleccionaremos la opción de menú Project > Add New Item, y esta vez, desde la categoría Web, elegiremos un elemento de tipo Domain Service Class, al que daremos el nombre NorthwindService.cs. 

 

Inmediatamente a continuación se abrirá un cuadro de diálogo para configurar el servicio de dominio, dentro del cual podremos elegir el contexto de datos (modelo de datos) con el que deseamos trabajar. En este ejemplo solamente disponemos del contexto de datos que acabamos de crear: NorthwindDataContext, que se mostrará de manera predeterminada.

Justo debajo del contexto de datos se muestran las entidades que lo componen, junto a una casilla para marcar aquellas con las que vamos a trabajar desde el lado cliente de la aplicación. Para que el código necesario sea generado en la parte cliente (proyecto Silverlight de la solución) deberemos marcar la casilla Enable client access.

Si queremos realizar operaciones de edición sobre las entidades, también podemos marcar la casilla Enable editing, aunque para la aplicación que estamos desarrollando no será necesario, ya que se trata de crear un ejemplo sencillo, basado exclusivamente en operaciones de consulta.

Tras aceptar este cuadro de diálogo generaremos la solución, que para el lado servidor de la aplicación (proyecto Web) tendrá como resultado la generación, por parte de .NET RIA Services, de la clase NorthwindService, derivada de LinqToSqlDomainService,  que representa al servicio de dominio. Esta última clase hereda a su vez de DomainService, clase base que contiene el funcionamiento esencial, común a todos los servicios de dominio.

La clase NorthwindService contendrá un método de consulta por cada una de las entidades existentes en el contexto de datos. La convención de notación seguida por .NET RIA Services para asignar los nombres a estos métodos se basa en utilizar el prefijo Get, seguido del nombre de la entidad. Cada uno de estos métodos devolverá una colección de entidades que representa a los registros de la tabla o vista de la base de datos, según el método que hayamos utilizado.

[EnableClientAccess()]
public class NorthwindService : LinqToSqlDomainService<NorthwindDataContext>

   public IQueryable<Order> GetOrders()
   {
       return this.Context.Orders;
   }
   public IQueryable<PaisesPedido> GetPaisesPedidos()
   {
       return this.Context.PaisesPedidos;
   }

Y llegados a este punto damos por concluida esta primera parte del artículo. En la próxima entrega abordaremos el código generado por .NET RIA Services a partir del servicio de dominio para la capa cliente de la aplicación y la creación de la interfaz de usuario. El ejemplo completo está disponible en los siguientes enlaces: C# y VB.

Un saludo.