Introducción a RIA Services – Play Silverlight

En este post haré una pequeña introducción a RIA Services, un framework que nos facilitará el desarrollo de aplicaciones RIA (Rich Internet Application). Este tipo de aplicaciones, implica llevar la lógica de presentación al cliente con lo que, a diferencia de las aplicaciones web tradicionales, la lógica de negocio y la de presentación se encuentran en dos capas diferentes. Para facilitar esa comunicación disponemos de RIA Services, que representa una capa intermedia que nos evita tener que desarrollar y mantener la lógica de la aplicación en ambas capas. A lo largo de esta entrada, explicaré los conceptos básicos de esta tecnología a través de un ejemplo y además veremos su integración con Entity Framework 4.

Crear el proyecto

Lo primer lógicamente es crear la solución, para lo cual disponemos de dos plantillas: Silverlight Bussines Application y Silverlight Application. La diferencia entre ellas es que, en la primera, RIA Services está habilitado por defecto, mientras que en la segunda no. Para el ejemplo, he utilizado la plantilla Silverlight Application, porque con el otro tipo, además de habilitar RIA Services, crea una estructura completa de proyecto que no utilizaré.  Una vez seleccionemos el nombre del proyecto, nos aparecerá la siguiente pantalla:

El check que permite habilitar RIA Services, situado en la parte inferior del cuadro de diálogo, no aparece habilitado por defecto. El haber habilitado RIA Services, hará que los proyectos creados incluyan todas las referencias y configuración necesarias para empezar a trabajar.

A continuación, crearemos dos proyectos uno de tipo Silverlight, que representa la parte cliente, y una librería de clases, que será la parte servidor. Ahora necesitamos crear un enlace entre ambos proyectos para que RIA Services nos facilite el desarrollo. Para ello, iremos a las propiedades del proyecto Silverlight y en la parte inferior veremos ‘Vínculo a WCF RIA Services’ y en la lista desplegable, seleccionamos la librería de clases que hemos añadido.

Propiedades del proyecto

Propiedades del proyecto

Tenemos la posibilidad de simplificar esto, utilizando una de las plantillas de Visual Studio 2010, WCF RIA Services Class Library, que dará como resultado dos proyectos (uno de tipo Silverlight y otro de clases normal, como lo hicimos anteriormente) con el enlace RIA Services entre ambos configurado.

Diseñar la base de datos

El siguiente paso es crear la base de datos de nuestra aplicación, para lo cual utilizaremos Entity Framework 4. Existen 3 formas de abordar un proyecto de base de datos utilizando Entity Framework 4:

  • Generar un modelo a partir de una base de datos
  • Crear un modelo de entidades desde cero
  • Utilizar Entity Framework prescindiendo del modelo de entidades

Al trabajar con EF4 podríamos hablar de dos enfoques: uno basado en el modelo de entidades EDM (Entity Data Model) y otro basado en objetos POCO (Plain Old CLR Objects). Para este ejemplo, utilizaré el enfoque basado en modelo de entidades y crearé la base de datos a partir de él.

Lo primero es añadir un nuevo elemento a la librería de clases que hemos creado (proyecto de datos) de tipo ADO.NET Entity Data Model:

Entity Data Model

Entity Data Model

Una vez hecho esto, aparecerá el diseñador de Entity Framework donde deberemos crear nuestras entidades y las relaciones existentes entre ellas. Disponemos de tres elementos en el diseñador:

  • Entidad: con la que creamos una entidad con una serie de propiedades
  • Asociación: nos permitirá relacionar dos entidades
  • Herencia: con la que podemos establecer una relación de herencia entre dos entidades
Entity Data Model

Entity Data Model

Desde el diseñador EDM también podemos editar las propiedades de entidades, campos y relaciones. En el caso de las entidades, podemos editar el nombre de la entidad, el nombre del conjunto de entidades o nivel de acceso. De los campos de una entidad se nos da la posibilidad de definir el tipo y en base éste, características como longitud máxima o valor por defecto. Por último, en cuanto a relaciones podemos determinar la multiplicidad de ambos lados de la relación, nombre de la misma y acción en caso de borrado de un lado de la relación, entre otros.

Una vez tengamos nuestro modelo terminado, es momento de generar la base de datos correspondiente. Tan solo tenemos que hacer clic con el botón derecho de ratón sobre el fondo del diseñador y seleccionar ‘Generar base de datos desde modelo’. Esto nos abrirá un cuadro de diálogo donde seleccionaremos el servidor de base datos y el nombre de la base de datos para que, a continuación, se genere un fichero ddl con la definición de nuestra BD y que se incluirá en el proyecto.

Para sincronizar modelo y base de datos, es necesario conectar el fichero ddl con la BD (pulsando el botón ‘Conectar’ de la barra de herramientas) y ejecutar el SQL creado.

Connectar DDL a Base de datos

Connectar DDL a Base de datos

El resultado será la base datos completa con las tablas y, sus  claves primarias y externas definidas. En este ejemplo se ha utilizado SQL Server, pero Entity Framework funciona con múltiples orígenes de datos, aquí podemos encontrar un listado de ellos.

Crear el servicio de datos

El siguiente paso es crear un servicio que exponga esos datos para lo cual disponemos de la clase DomainService, en la que definiremos e implementaremos las operaciones que queremos hacer disponibles a los clientes.

Añadir Servicio de Dominio

Añadir Servicio de Dominio

Para ello, añadimos un nuevo elemento de tipo ‘Domain Service Class’ a nuestro proyecto de datos. Esto hará que, a continuación, se nos muestre un cuadro de diálogo donde nos pedirá seleccionar las entidades que queremos hacer disponibles a través del servicio.

Domain Service

Domain Service

Al lado de cada entidad, aparece un check que, al marcarlo, hará que el servicio generado incluya operaciones de inserción, actualización y borrado. Si no se marca, solo se incluirán operaciones de consulta que devuelven un listado de entidades.

En esta misma pantalla, en la parte inferior, encontramos el check ‘Generar clases asociadas para metadatos’, que si marcamos, nos creará un fichero de metadatos (NombreServicio.metadata.cs) donde aparecerán todas las entidades (que EF crea con el modificador partial) que hayamos decidido incluir en el servicio, más una clase interna que representa los metadatos. La clase interna incluye las mismas propiedades que la entidad y nos permite decorar las propiedades con atributos para indicar si es una propiedad requerida (Required), que debe cumplir una expresión regular (RegularExpression) o la longitud de una cadena (StringLength), entre otros. Esos atributos serán llevados a cliente y nos facilitarán la validación de datos de entrada.

Al pulsar OK se creará el servicio que heredará de LinqToEntitiesDomainService tipado de tipo del contenedor de entidades (en el ejemplo AcbCommunityDataModelContainer) con las operaciones básicas incluidas.

[EnableClientAccess()]
public class AcbCommunityDomainService : LinqToEntitiesDomainService<AcbCommunityDataModelContainer>
{

public IQueryable<Player> GetPlayers({
return this.ObjectContext.Players;
}
public void InsertContract(Contract contract)
{
if ((contract.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(contract, EntityState.Added);
}
else
{
this.ObjectContext.Contracts.AddObject(contract);
}
}

Además de las operaciones auto-generadas, podemos incluir las nuestras propias en la que, para acceder a las entidades, se debemos utilizar la propiedad ObjectContext. Esta parte corresponde a la capa servidor, en la siguiente sección veremos la relación entre el proyecto cliente que habíamos creado y el proyecto donde tenemos el servicio de dominio.

Código generado

Con el servicio de dominio creado y las operaciones que deseemos exponer implementadas, tenemos que hacer uso de ellas. El resultado de enlazar un proyecto Silverlight con un proyecto de dominio lo vemos al compilar la solución. Al compilar se crea un fichero en el proyecto cliente que contiene una clase que representa el contexto del dominio con todas las consultas disponibles y una clase por cada entidad expuesta por el servicio.

En un principio el fichero generado no está visible, para mostrarlo deberemos pulsar el botón ‘Mostrar Todos los Ficheros’ en el explorador de la solución. Encontraremos una carpeta llamada Generated_Code, que incluye una clase con el nombre del proyecto servidor con extensión .g.cs, donde encontraremos los comentado anteriormente.

Mostrar todos los archivos

Mostrar todos los archivos

Utilizar el código generado

Ahora debemos hacer uso del código generado para lo cual creamos una clase que encapsule el acceso a la clase de contexto, lo que simplificará el uso de los métodos de éste. Los métodos la nueva clase deberán definir, además de los parámetros propios del método, una función de callback ya que todas las operaciones se realizar de forma asíncrona. En este trozo de código se puede ver cómo hacer uso de las operaciones del contexto.

public void LoadTeams(Action<LoadOperation<Team>> callback, object state)
{
_context.Load<Team>(_context.GetTeamsQuery(), callback, state);
}

public void GetPlayersByTeam(Team selectedTeam, Action<LoadOperation<Player>> callback, object state)
{
_context.Load<Player>(_context.GetPlayersByTeamQuery(selectedTeam.TeamId), callback, null);
}

En ambas operaciones se hace uso del método Load del contexto, que inicia una operación de carga, y que tiene como parámetros un EntityQuery (RIA Services genera una en la clase del contexto por cada método definido en el servicio del dominio), una función de callback y un objeto de estado (opcional).

Llegados a este punto ya podemos utilizar nuestro servicio de datos en todas las secciones de nuestra aplicación. Dejo disponible el proyecto que he desarrollado para escribir este post y este es resultado del mismo en ejecución. Además de RIA Services, se utiliza Prism y Unity. Descargar Proyecto

Aquí dejo algunos enlaces interesantes relacionados:

Anuncios
Esta entrada fue publicada en Entity Framework, Prism, RIA Services, Silverlight y etiquetada , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s