Si usted está construyendo una aplicación de negocios que necesita mover datos desde servidores hacia su aplicación Silverlight, WCF RIA Services tendrá que estar entre los recursos más importantes que deberá contar en sus conocimientos. WCF RIA Services le provee a su capa de presentación un rápido y fácil acceso a los servicios y datos que están disponibles desde la capa media de su aplicación. La mayoría de los desarrolladores que están comenzando a usar Silverlight vienen de ASP.NET, donde tratar con la lógica y los datos entre las capas (tiers) era un poco más simple. En una aplicación ASP.NET tradicional, esto era más sencillo debido a que la capa de presentación y la capa media (la capa de negocio) estaban, por lo general en el mismo servidor. La página generada una vez completado el requerimiento del usuario, y después de interactuar con la capa de negocios por cualquier tipo de lógica o de datos, era enviada al cliente como HTML, JavaScript, etc. Las interacciones adicionales entre el cliente y la capa media podía hacerse con una completa actualización de la página, o usando AJAX para hacer conexiones con el nivel medio en la nube. Esto se ve reflejado en la figura 1:

Figura 1- Arquitectura de una aplicación web tradicional.


Silverlight, por su parte, ofrece una separación más marcada entre la presentación y la capa media de su aplicación. El código de la aplicación está en realidad residiendo en el cliente. El cliente tendrá que tener un medio para comunicarse con la capa media para obtener la lógica y los datos que se requieren. Los Servicios WCF RIA son un medio para hacer el proceso de la comunicación entre lo que está en el cliente y lo que está en su servidor mucho más fácil, ya que ha sido diseñado específicamente para aplicaciones ricas de Internet (RIA Applications). La figura 2, muestra la arquitectura de una aplicación RIA:

Figura 2- Arquitectura de una aplicación RIA.


En la figura 2, puede ver que la capa de presentación está ahora en el cliente y los Servicios RIA son el nexo de unión entre la capa de negocios y esta capa de presentación. Con los servicios WCF RIA, usted tendrá la visión programática que ambas capas estan en el mismo lugar. WCF RIA Services, es exactamente lo que su nombre indica. Se trata de una tecnología, que como WCF Data Services, se basa en Windows Communication Foundation Aunque WCF RIA Services simplifica su vida como desarrollador y hace fácil trabajar con sus datos, tambien le da las capacidades que usted puede necesitar para profundizar dentro de WCF y aprovechar al máximo todo lo que nos ofrece WCF. Usar WCF RIA Services no lo limitará en sus capacidades para trabajar con WCF en general. Lo bueno, sin embargo, es que si usted ha encontrado que WCF es complejo, y que no está demasiado interesado en profundizar sus conocimientos en esta tecnología, le va a gustar trabajar con WCF RIA Services, ya que oculta la complejidad de la mejor manera posible.

Construyendo una Simple Aplicación RIA Services

WCF RIA Services se puede obtener bajándolo de esta dirección. Una vez instalado, encontrará algunas nuevas capacidades relacionadas con WCF RIA Services, contenidas dentro de Visual Studio. Para el ejemplo que hare, utilizaré Visual Studio 11 Beta, pero si sigue este ejemplo con Visual Studio 2010, no habrá diferencias: En Visual Studio, seleccione el menú File -> New -> Project. Aparecerá el diálogo "New Project". Seleccione Silverlight de la lista de plantillas instaladas y verá una lista de las opciones de proyectos Silverlight, como se ve en la figura 3.

Creando un nueva aplicación de negocios de Silverlight
Figura 3- Creando un nueva aplicación de negocios de Silverlight.


Si acaba de instalar WCF RIA Services SP2 for Silverlight 4 and 5, se dará cuenta que aparecerán dos nuevas plantillas (Silverlight Business Application y WCF RIA Services Class Library). La última opción, le permitirá crear un proyecto que sea una biblioteca de clases de WCF RIA Services, que podrá ser utilizada por cualquiera de sus aplicaciones de Silverlight. Para nuestro ejemplo seleccionamos la opción Silverlight Business Application y dejamos el nombre por defecto, (BusinessApplication1). Una vez que cree la solución BusinessApplication1, encontrará 2 proyectos en ella. Los dos proyectos y sus componentes, son mostrados en la ventana "Visual Studio Solution Explorer", como se muestra en la figura 4:

La ventana Solution Explorer de Visual Basic, después de haber creado una nueva solución del tipo Silverlight Business Application
Figura 4- La ventana Solution Explorer de Visual Basic, después de haber creado una nueva solución del tipo Silverlight Business Application.


BusinessApplication1 es la aplicación de Silverlight, y BusinessApplication1.Web es la solución de servidor que debe incluir los servicios WCF RIA. En este momento, aún no hay un servicio WCF RIA, ya que tendrá que construirlo usted mismo. Sin embargo, se dará cuenta de que ya hay un trozo de una aplicación construída por Visual Studio. Este es un enfoque que Microsoft llama una "arquitectura prescriptiva", o una arquitectura que se prescribe a los desarrolladores para que sigan al usar sus tecnologías, sin embargo, usted como programador, puede seguir esta receta, pero también puede poner las cosas exactamente como le parezca. Si compila y ejecuta la aplicación BusinessApplication1 tal como está hasta este momento, se presentará una aplicación básica de Silverlight con un poco de navegación básica (como se muestra en la figura 5).

La aplicación BusinessApplication1 ejecutada sin haber escrito ni una línea de código
Figura 5- La aplicación BusinessApplication1 ejecutada sin haber escrito ni una línea de código.


En este momento, no hay servicios WCF RIA que esten siendo utilizados. El siguiente paso es cambiar esta situación y crear un servicio WCF RIA dentro de esta solución.

 

 

 

 

 


Primer Paso: Construir un "Entity Data Model"

Primero debemos construir un modelo de entidad de datos (entity data model) y exponer ese modelo desde la solución del lado del servidor. No está obligado a usar modelos de entidad de datos para trabajar con WCF RIA Services. Puede tambien usar "LINQ to SQL", objetos del tipo POX (plain old XML objects), y web services estandard. En este ejemplo, construiremos un Servicio WCF RIA que hará uso del Entity Framework. Para hacer esta tarea, primero necesita agregar una base de datos con la que trabajar. Usaremos la base de datos "AdventureWorks.mdf" que viene como ejemplo en SQL Server 2008. Usted puede bajarla haciendo click aquí. En mi caso, me conectaré a la instancia local de SQL Server Express (".\SQLExpress"). Comencemos agregando un "ADO.NET Entity Data Model" a nuestro proyecto. Encontrará esto en la sección "Data" de las plantillas instaladas en Visual Studio. Nombre su ADO.NET Entity Data Model como AdventureWorks.edmx como se muestra en la figure 7:

 

 

 

 

 

Agregamos un modelo de entidad de datos
Figura 7- Agregamos un modelo de entidad de datos.


Haciendo click en el botón Add en el diálogo Add New Item, aparece el Wizard Entity Data Model (como se ve en la figure 8):

Primera pantalla del 'Entity Data Model Wizard'
Figura 8- Primera pantalla del "Entity Data Model Wizard".


Elegimos la opción database y hacemos click en el botón "Next" y aparecerá el segundo paso del wizard, y allí elegimos la conexión a la base de datos AdventueWorks, como se ve en la figura 9 y en la 10:

Segunda pantalla del 'Entity Data Model Wizard'
Figura 9- Segunda pantalla del "Entity Data Model Wizard".

 

 

 

 

 


Las siguientes ventanas del 'Entity Data Model Wizard', nos permiten configurar nuestro Modelo de Entridad de Datos
Figura 10- Las siguientes ventanas del 'Entity Data Model Wizard', nos permiten configurar nuestro Modelo de Entridad de Datos.

En la figura 10, A la izquierda: primero creamos la conexión a nuestra base de datos; al centro: se ve como queda la conexión una vez establecida y a la derecha: elegimos las 6 tablas siguientes pertenecientes al esquema HumanResources: 1. Department 2. Employee 3. EmployeeAddress 4. EmployeeDepartmentHistory 5. EmployeePayHistory 6. JobCandidate Además en esta ventana marcamos la opción Pluralize or singularize generated object names. Haciendo click en el botón Finish, se carga la vista del diseño del modelo en Visual Studio. Ver Figura 11:

 

 

 

 

 

Visual Studio carga la ventana de diseño del modelo de entidad de datos que hemos creado
Figura 11- Visual Studio carga la ventana de diseño del modelo de entidad de datos que hemos creado.


Se habrá dado cuenta de que la cadena de conexión para la base de datos ha sido añadida al archivo web.config, como se informó en el asistente. Ahora que ya hemos creado el modelo de entidad de datos, compilemos la aplicación y ya estará listo para construir el "Domain Service".

 

 

 

 

 


Segundo Paso: Construyendo un "Domain Service"

Ahora es el momento para construir nuestro primer "Domain Service" (servicio de dominio). Un Domain Service le permite exponer las piezas del modelo de datos que desee, así como las operaciones sobre esas piezas que usted necesitará para su aplicación cliente.

 

 

 

 

 

Agregando la clase "Domain Service"

Haciendo click derecho en el proyecto BusinessApplication1.Web (en la ventana solution explorer), elegimos la opción "add a new item". En el cuadro diálogo Add New Item, seleccionamos Web, en el panel de la izquierda (Plantillas Instaladas) y luego Domain Service Class, dándole el nombre de "AdventureWorksDomainService.cs", como se ve en la figure 12:

Creamos una nueva clase del tipo 'Domain Service Class'
Figura 12- Creamos una nueva clase del tipo "Domain Service Class".


Al pulsar el botón Add, en la ventana mostrada en la figura 12, aparecerá el cuadro de diálogo "Add New Domain Service Class", como se ve en la figura 13:

En esta ventana configuramos la clase 'AdventureWorksDomainService'
Figura 13- En esta ventana configuramos la clase 'AdventureWorksDomainService'.


En la figura 13, vemos que estamos construyendo una nueva clase basada en lo que usted quiere conseguir del modelo de entidad de datos creado anteriormente. En el cuadro de diálogo, verá que la clase está haciendo uso del modelo de entidad de datos AdventureWorksEntities creado anteriormente. Visual Studio lee todas las entidades que provee nuestro modelo y nos muestra una lista de lo que está disponible. En nuestro caso, seleccionamos todas las entidades. Habrá notado que vamos a habilitar la entidad Employee para edición. Esto significa que expondremos la habilidad de insertar, actualizar, o borrar elementos para este modelo. Otra cosa para prestar atención en este diálogo es el checkbox para habilitar acceso desde un cliente al "domain service". Asegúrese que chequea esta opción para que su cliente Silverlight tenga acceso a lo que estamos contruyendo acá. Haciendo click en el botón OK en este diálogo producirá un nuevo archivo (AdventureWorksDomainService.cs), que será abierto en nuestro editor de código de Visual Studio. Este es un archivo de clase que ha sido generado por Visual Studio y expone los objetos que usted elige de su modelo de entidad. Si observa el código generado, verá que hace uso del framework "RIA Services" subyacente, usando el namespace System.ServiceModel.DomainServices. Además observando la definición de la clase encontrará este código:

[EnableClientAccess()]
public class AdventureWorksDomainService :
        LinqToEntitiesDomainService<AdventureWorksEntities>
{
    // Hemos removido el código para mayor claridad
}

La clase que Visual Studio ha generado, hereda de una clase base abstracta llamada LinqToEntitiesDomainService<T>. Esta clase base es parte del framework "RIA Services" y expondrá el modelo de entidad que queremos exponer. Visual Studio, pondrá el nombre del modelo de entidad en lugar de T por eso en nuestro caso, el código dice que la clase hereda de LinqToEntitiesDomainService<AdventureWorksEntities>. Recuerde que AdventureWorksEntities fue el modelo de entidad de datos que usted creo anteriormente, en el paso 1. Otro aspecto importante a destacar, es que esta clase se ha habilitado para el acceso del cliente (seleccionando la casilla de verificación anteriormente en el cuadro de diálogo "Agregar una nueva clase de dominio de servicio"). En el código, esto se logra mediante la adición del atributo de la clase [EnableClientAccess ()]para la clase. Buscando en la clase, puede ver que se han creado una serie de métodos que exponen las entidades del modelo. Veamos el método GetEmployees ():

public IQueryable<Employee> GetEmployees()
{
   return this.ObjectContext.Employees;
}

En este fragmento de código, puede ver que el método GetEmployees() devuelve un IQueryable<Employee>, el cual es una lista de empleados y es del tipo interface IQueryable<T>. IQueryable<T> está el namespace System.Linq. Puede ver que este método devolverá todos los empleados encontrados en la tabla; pero, lógicamente, usted puede, si lo quiere, cambiar la salida para preveer cualquier filtro u ordenamiento que influya directamente en la salida de este método. Como hemos chequeado la opción edit cuando configuramos la clase, además del método GetEmployees(), en la clase, aparecen también métodos para insertar, actualizar, y borrar empleados:

public void InsertEmployee(Employee employee)
{
   // Hemos removido el código para mayor claridad
}

public void UpdateEmployee(Employee currentEmployee)
{
   // Hemos removido el código para mayor claridad
}

public void DeleteEmployee(Employee employee)
{
   // Hemos removido el código para mayor claridad
}

Una vez creada esta clase de dominio de servicio, compilamos la aplicación y será el momento de conectar el cliente de Silverlight con nuestro Domain Service.

Paso 3: Conectar el cliente de Silverlight con el Domain Service.

Si ha seguido este tutorial paso a paso, en este punto todo lo que respecta al proyecto de lado del servidor está ya listo. Este proyecto incluye ahora un modelo de entidad y el modelo se expone al cliente a través de un servicio de dominio. Ahora trabajaremos con el proyecto Silverlight "BusinessApplication1", para hacer la conexión a este servicio de dominio. Comenzaremos mostrando una lista completa de los empleados de la tabla Empleado utilizando el método GetEmployees (). Para ello, crearemos una nueva página Silverlight llamada Employees.xaml. Ubicaremos esta vista dentro de la carpeta Views, junto con los archivos About.xaml, Home.xaml y ErrorWindow.xaml. Puede editar estos archivos y observarlos, para que al configurar la página Employees.xaml, se ajuste con el resto de la aplicación. La página Employees.xaml mostrará todos los empleados que se proporcionan a través del servicio de dominio, en un Grid.

Agregamos una nueva Pagina y la llamamos Employees.
Figura 14- Agregamos una nueva Pagina y la llamamos Employees.

 

 

 

 

 


Pasos para configurar la página Employees.xaml

Una vez agregada la página Employees.xaml y ubicada en la carpeta Views, tendremos que hacer una serie de pasos para que nuestra aplicación sea funcional:

 

 

 

 

 

Cambiamos el título de nuestra Página.
Figura 15- Cambiamos el título de nuestra página.
Agregamos una nueva cadena al archivo de recursos ApplicationStrings.resx.
Figura 16- Agregamos una nueva cadena al archivo de recursos ApplicationStrings.resx.
Agregamos los controles necesarios para mantener la misma estructura en esta página que en las demás
Figura 17- Agregamos los controles necesarios para mantener la misma estructura en esta página que en las demás.
   
  xmlns:mio="clr-namespace:System.Windows.Controls;
     assembly=System.Windows.Controls.Data"
El código anterior se debe agregar en una misma línea y sin espacios antes y después del ; (...System.Windows.Controls;assembly=...). Aquí lo escribo en dos para que se vea mejor en la página
 <mio:DataGrid x:Name=”gridEmployees” />
<Rectangle x:Name="Divider2" Style="{StaticResource DividerStyle}"/>

<HyperlinkButton x:Name="Link3" Style="{StaticResource LinkStyle}" 
      NavigateUri="/Employees" TargetName="ContentFrame" 
      Content="{Binding Path=Strings.EmpleadosPageTitle, 
           Source={StaticResource ApplicationResources}}"/>
  1. En el código xaml generado al agregar la nueva página, cambiamos el título por "Empleados", quedando así:

  2. En Solution Explorer abrimos la carpeta Assets/Resources, editamos el archivo ApplicationStrings.resx y agregamos una nueva cadena llamada EmpleadosPageTitle y dándole el valor Empleados (Ver figura 16):

  3. En el código que se ve en la figura 15, en el nodo <Grid> agregamos el siguiente código, que es similar al de las páginas About y Home, excepto lo que está marcado en azul, en la figura 17:

  4. En el código que se ve en la figura 15, agregamos (en una misma línea), inmediatamente después de x:Class="BusinessApplication2.Employees", lo siguiente:

  5. Agregamos la referencia a ese assembly System.Windows.Controls.Data

  6. Debajo del código del control <TextBox>, que se ve en la figura 17, agregamos el siguiente código:
  7. Abrimos el archivo de código de la página(Employees.xaml.cs) y agregamos lo siguiente:
  8. a. Importamos el namespace BusinessApplication1.Web:
     using BusinessApplication1.Web;
    
    b. En el constructor de la clase Employees, luego de la línea InitializeComponent(), agregamos la sentencia que establece el "handler" del evento Loaded al método Employees_Loaded, que escribiremos en el punto c:
    Loaded += Employees_Loaded;
    
    c. Agregamos el siguiente método que será el método que se ejecutará en respuesta al evento Loaded de la clase Employees (la página Silverlight):
           private void Employees_Loaded(object sender, 
                         RoutedEventArgs e)
           {
               AdventureWorksDomainContext context = 
                         new AdventureWorksDomainContext();
               gridEmployees.ItemsSource = context.Employees;
               context.Load(context.GetEmployeesQuery());
           }
    
  9. Para agregar un botón de link en la página inicial, que nos permita navegar a la página que hemos creado, editamos el archivo MainPage.xaml, ubicamos la localización de los botones de enlace (HyperlinkButton) y agregamos el siguiente código debajo del HyperlinkButton que navega hacia la página About:


Ya hemos creado nuestra aplicación! Ahora ejecutémosla y al aparecer la pagina inicial, pulsemos el botón "Empleados" y luego de unos segundos, tendremos nuestra aplicacón totalmente funcional, usando un RIA Service. La figura 18, muestra la salida que obtenemos al pulsar el botón Empleados:

La aplicación Silverlight obtiene los datos utilizando un servicio RIA
Figura 18- La aplicación Silverlight obtiene los datos utilizando un servicio RIA.


Hasta aquí, hemos visto cómo conectar con el servicio de dominio a través de código y trabajar con los datos subyacentes que se recuperan. En el artículo RIA Services: Conexión al servicio de dominio a través de XAML que escribiré próximamente, examinaremos otra solución de este problema, pero, esta vez lo haremos haciendo uso de la codificación declarativa de XAML.

respag
Panamá - © 2012
Haga su donación para colaborar con La Escuela del Programador

La Escuela del Programador es un sitio web sin anuncios, sin ánimo de lucro, no es un sitio web comercial. Es el sueño de compartir con todos, muchos años de una gran pasión. Si realmente encuentra este sitio útil y lo aprovecha, le pido su generosa y no importa cuán modesta colaboración, simplemente para afrontar los costos de mantener este sitio disponible en internet.
No deseo lucrar con este sitio, ya que lo hago desinteresadamente, sólo le pido que, si puede, aporte (desde un dólar hasta lo que crea que puede dar), para afrontar los costos de dominio y hosting. Muchísimas gracias y ojalá juntos podamos hacer un sitio que sea una buena fuente de aprendizaje de programacíon en español.

Si no se siente en condiciones de colaborar, igualmente será bienvenido al sitio, es libre para todos y será un placer que encuentre mis artículos provechosos, pero si realmente me ayuda con una donación minima, seguramente, colaborará para que La Escuela del Programador se mantenga en la Web y crezca, conviertiendo a este sitio hecho con mucha pasión, dedicación y esfuerzo, en una buena fuente de aprendizaje.

Mis saludos cordiales y gracias por interesarse en mi sitio.

Rubén E. Spagnuolo
respag
Panamá - © 2012