Crear un servicio de dominio que utilice entidades definidas con POCO
En este tema se muestra cómo usar WCF RIA Services para crear un servicio de dominio que utiliza POCO (objetos CLR convencionales). El objetivo es mostrar cómo se crea una aplicación de RIA Services muy elemental basada en POCO que explique, en particular, lo que sucede exactamente cuando se utilizan las herramientas de RIA Services (asistentes y cuadros de diálogo) durante los distintos pasos del procedimiento. Los datos proporcionados desde POCO se pueden utilizar para liberar una aplicación de dependencias en bases de datos back-end a efectos de portabilidad o seguridad de datos o con fines de pruebas. RIA Services admite totalmente el código de cliente generado automáticamente, con entidades definidas con POCO como sucede con LINK to SQL o Entity Framework. El servicio de dominio de RIA Services es, de hecho, indiferente con respecto al origen de datos, por lo que esta clase de POCO se puede reemplazar posteriormente por un componente con acceso a los datos de otro origen como una base de datos sin cambiar el propio servicio de dominio.
El procedimiento que se describe aquí requiere la instalación y configuración correctas de varios programas de requisitos previos, como Visual Studio 2010 y Silverlight Developer Runtime y SDK, además de WCF RIA Services. No se requiere el Kit de herramientas de WCF RIA Services. Los temas del nodo Requisitos previos para WCF RIA Services proporcionan instrucciones detalladas para el cumplimiento de cada uno de estos requisitos previos. Siga las instrucciones proporcionadas en ellos en cuanto a los programas necesarios antes de realizar este procedimiento para asegurarse de encontrar el menor número de problemas posibles.
Crear una solución de RIA Services
Cree un nuevo proyecto de RIA Services en Visual Studio 2010 seleccionando Archivo, Nuevo y, a continuación, Proyecto.
Aparece el cuadro de diálogo Nuevo proyecto.
Seleccione la plantilla Aplicación de Silverlight del grupo Silverlight de las Plantillas instaladas y asigne al nuevo proyecto el nombre RIAServicesPocoExample.
Haga clic en Aceptar.
Aparece el cuadro de diálogo Nueva aplicación de Silverlight.
Active la casilla Habilitar WCF RIA Services situada cerca de la parte inferior del cuadro de diálogo. La activación de esta casilla crea un vínculo a RIA Services entre el proyecto de cliente y el proyecto de servidor. Para habilitar esta conexión, esta herramienta agrega las referencias siguientes al proyecto de cliente:
System.ComponentModel.DataAnnotations
System.Runtime.Serialization
System.ServiceModel.dll
System.ServiceModel.DomainServices.Client
System.ServiceModel.DomainServices.Client.Web
System.ServiceModel.Web.Extensions
System.Windows.Browser
Haga clic en Aceptar para crear la solución.
La solución contiene dos proyectos: un proyecto de cliente y un proyecto de servidor.
RIAServicesPocoExample: proyecto de cliente que contiene el código de Silverlight que se utiliza para crear el nivel de presentación.
RIAServicesPocoExample.Web: proyecto de servidor que contiene el código de nivel intermedio.
Crear un servicio de dominio
Haga clic con el botón secundario en el proyecto de servidor, seleccione Agregar y, a continuación, Nuevo elemento.
En la lista de categorías, seleccione Web y, a continuación, seleccione la plantilla Clase de servicio de dominio.
Asigne a la clase el nombre SovereignDomainService.cs (o SovereignDomainService.vb).
Haga clic en Agregar.
Aparece el cuadro de diálogo Agregar nueva clase de servicio de dominio.
Asegúrese de que esté activada la casilla Habilitar acceso de cliente.
Observe que la única opción disponible en el menú desplegable para las Clases DataContext/ObjectContext disponibles es la entidad de la <clase de servicio de dominio vacía> y que no se puede activar la casilla Generar clases asociadas para metadatos porque no hay contextos de datos disponibles a los que asociar el servicio.
Haga clic en Aceptar.
Este asistente realiza varias acciones. Genera una clase de
SovereignDomainService
vacía en un nuevo archivo SovereignDomainService.cs (o SovereignDomainService.vb) con atributos asociados e instruccionesusing
. También agrega cuatro referencias de ensamblado al proyecto de servicio y elementos de configuración al archivo Web.config.Para observar este hecho, abra el archivo SovereignDomainService.cs (o SovereignDomainService.vb) si no se ha abierto automáticamente. Observe que el archivo tiene las siguientes características:
Se han agregado las instrucciones
using
siguientes:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server
La clase
SovereignDomainService
deriva de la clase DomainService, que es una clase base abstracta en el marco de RIA Services . Esta es la clase base para la totalidad del servicio de dominio expuesto en RIA Services .La clase
SovereignDomainService
se marca con el atributo EnableClientAccessAttribute para indicar que está visible para el nivel de cliente.
Observe que el asistente ha agregado las referencias siguientes al proyecto de servicio:
System.ComponentModel.DataAnnotations
System.Runtime.Serialization
System.ServiceModel.DomainServices.Hosting
System.ServiceModel.DomainServices.Server
Finalmente, abra el archivo Web.config y examine los nuevos elementos agregados por el asistente.
<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="DomainServiceModule" preCondition="managedHandler" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </modules> <validation validateIntegratedModeConfiguration="false" /> </system.webServer> <system.web> <httpModules> <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </httpModules> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> </configuration>
Exceptuando el elemento de configuración cuyo destino es .NET Framework 4, cada uno de estos elementos se ha agregado mediante el cuadro de diálogo Agregar nueva clase de servicio de dominio. Estos elementos habilitan diversos hospedajes de Internet Information Services (IIS) y opciones de ASP.NET.
El asistente agrega un elemento
<modules>
en la sección<system.webserver>
que el hospedaje de IIS 7 requiere.El asistente agrega un elemento
<add>
del elemento<httpModules>
en la secciónsystem.web
que el hospedaje de IIS 6 requiere.Los servicios de dominio de RIA Services son servicios de Windows Communication Foundation (WCF) y, cuando se hospedan con ASP.NET, es necesario que lo hagan en el modo de compatibilidad de ASP.NET. Este requisito no se puede establecer en el código y se debe especificar en el archivo Web.config. El modo de compatibilidad de ASP.NET se habilita estableciendo la propiedad
aspNetCompatibilityEnabled
en true, en el elemento<ServiceHostingEnvironment>
de la sección<system.serviceModel>
.
Agregar la clase POCO
Este procedimiento describe cómo se indica al marco de RIA Services que se va a utilizar una clase POCO como tipo de entidad. Los tipos de entidad proporcionan estructuras de datos al modelo de datos de la aplicación y se requiere que cada tipo de entidad tenga una clave de entidad única. La estructura de los datos la especifica el conjunto de datos que contiene. La clave de entidad se proporciona reemplazando una propiedad (o un conjunto de propiedades) que debe proporcionar un nombre único para cada objeto entidad que lo distingue de otras entidades del mismo tipo. Esto se especifica normalmente utilizando metadatos de algún tipo. Este procedimiento realiza esta operación mediante la aplicación del atributo
[Key]
a una propiedad y, de hecho, la aplicación de este atributo es la que indica al marco de RIA Services que las instancias de la clase POCO son objetos entidad.Abra el archivo SovereignDomainSevice.cs.
En el ámbito del espacio de nombres RIAServicesPocoExample.Web, debajo de la clase
SovereignDomainService
auxiliar, agregue el código siguiente para la claseSovereign
:public class Sovereign { [Key] public int UniqueId { get; set; } public string Name { get; set; } public string House { get; set; } public string Dominion { get; set; } public int ReignStart { get; set; } public int ReignEnd { get; set; } public string Sobriquet { get; set; } }
En este ejemplo, la propiedad
UniqueId
es la clave de entidad que proporciona un nombre único a cada objeto entidad de tipoSovereign
. El atributo[Key]
se define en el ensamblado System.ComponentModel.DataAnnotations, que ya se ha agregado al proyecto de servidor, al igual que la instrucciónusing
para el espacio de nombres correspondiente que lo contiene. La clave de entidad también puede especificarse en un archivo de metadatos o en otros medios, pero esta es una forma cómoda de indicarla directamente en la clase POCO.Agregue el método
FetchSovereigns()
a la claseSovereign
que devuelve una lista de instancias deSovereign
.public List<Sovereign> FetchSovereigns() { List<Sovereign> sovereignList = new List<Sovereign> { new Sovereign() {UniqueId = 1, Name = "John", House = "Plantagenet", Dominion = "Angevin Empire", ReignStart = 1167, ReignEnd = 1216, Sobriquet = "Lackland" }, new Sovereign() {UniqueId = 2, Name = "Charles", House = "Stuart", Dominion = "England, Scotland, & Ireland", ReignStart = 1625, ReignEnd = 1649, Sobriquet = "The Martyr" }, new Sovereign() {UniqueId = 3, Name = "William", House = "Dunkeld", Dominion = "Scotland", ReignStart = 1165, ReignEnd = 1249, Sobriquet = "The Lion" }, new Sovereign() {UniqueId = 4, Name = "Elizabeth", House = "Tudor", Dominion = "England", ReignStart = 1555, ReignEnd = 1609, Sobriquet = "The Virgin Queen" }, new Sovereign() {UniqueId = 5, Name = "Ivan", House = "Vasilyevich", Dominion = "Russia", ReignStart = 1533, ReignEnd = 1584, Sobriquet = "The Terrible" }, new Sovereign() {UniqueId = 6, Name = "Charles", House = "Valois", Dominion = "France", ReignStart = 1380, ReignEnd = 1422, Sobriquet = "The Mad" } }; return sovereignList; }
Definir el servicio de dominio
Este procedimiento describe la forma de crear una consulta en el servicio de dominio que estará accesible desde el cliente para recuperar datos de las entidades definidas con POCO. El marco de RIA Services necesita saber cuáles de sus métodos van a estar disponibles en el cliente como consultas y, para conseguir esto, se utiliza una convención de nomenclatura. El marco de RIA Services reconoce como consultas los nombres de métodos que empiezan con
Get
y que devuelven una interfazIEnumerable<EntityType>
o una interfazIQueryable<EntityType>
.Sugerencia: IQueryable deriva de IEnumerable. Use IEnumerable para colecciones en memoria como nuestras entidades definidas con POCO y utilice IQueryable al obtener acceso a un origen de datos remoto o subyacente como una base de datos SQL. Agregue el método
GetSovereign()
a la claseSovereignDomainService
.public IEnumerable<Sovereign> GetSovereigns() { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns(); }
Con esto, se devuelven todas las entidades de soberanos de la colección. Pero, normalmente, solo se desea devolver un subconjunto de las entidades. Para ilustrar esto, modifique esta consulta de modo que solo se devuelvan los soberanos de esta lista que reinaron durante la Edad Media, es decir, en el caso de que
sovereign.ReignEnd
<= 1500. El código siguiente realiza esta acción:public IEnumerable<Sovereign> GetSovereignsByReignEnd(int ReignedBefore) { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns().Where<Sovereign>(p => p.ReignEnd <= 1500); }
Genere (Ctrl+Mayús+B) la solución para crear el código proxy de cliente generado automáticamente.
En el Explorador de soluciones, seleccione el proyecto de cliente RIAServicesPocoExample, haga clic en el icono Mostrar todos los archivos situado en la parte superior de la ventana y examine el archivo RIAServicesPocoExample.Web.g.cs de la carpeta Generated_Code. Examine el código generado automáticamente de este archivo y tome nota de los elementos siguientes:
Se genera una clase
WebContext
que deriva de la clase WebContextBase y se utiliza para administrar el contexto de aplicación.Se genera una clase
Sovereign
que deriva de la clase Entity para la entidad expuesta por el servicio de dominio. La clase de entidadSovereign
del proyecto de cliente coincide con la entidadSovereign
en el servidor.Se genera una clase
SovereignDomainContext
que deriva de la clase DomainContext. Esta clase tiene un método denominadoGetSovereignsByReignEndQuery
que corresponde al método de consulta creado en el servicio de dominio.
Para obtener más información sobre la generación automática de código, vea el tema Generación de código de cliente. Para obtener información sobre cómo se personaliza la generación de código, vea el tema Personalizar el código generado.
Mostrar el resultado de una consulta en el cliente de Silverlight
Abra MainPage.xaml.
Desde el Cuadro de herramientas situado a la izquierda, arrastre un control DataGrid hasta el interior del elemento Grid en la vista XAML.
La acción de arrastrar el control DataGrid desde el Cuadro de herramientas hace que se agregue una instrucción
using System.Windows.Controls
de espacio de nombres al archivo MainPage.xaml.cs y que se agreguen automáticamente al proyecto de cliente referencias a los ensamblados System.Windows.Controls.Data y System.Windows.Controls.Data.Input.Precaución: Si agrega el control DataGrid sin arrastrarlo desde el Cuadro de herramientas, debe agregar manualmente al proyecto de cliente las referencias a los ensamblados y la instrucción "using" en el archivo de código subyacente. Cambie el valor de
AutoGeneratedColums
a True, asigne al elementoDataGrid
el nombreSovereignGrid
y ajuste los atributosHeight
yWidth
como se muestra en el código XAML siguiente.<Grid x:Name="LayoutRoot" Background="White"> <sdk:DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="157,86,0,0" Name="SovereignGrid" VerticalAlignment="Top" Width="600" /> </Grid>
Abra el archivo MainPage.xaml.cs.
Agregue dos instrucciones
Imports
(Visual Basic) ousing
(C#):using RIAServicesPocoExample.Web;
yusing System.ServiceModel.DomainServices.Client;
.El espacio de nombres RIAServicesPocoExample.Web es el espacio de nombres que contiene el código generado para el proyecto de cliente en RIAServicesPocoExample.Web.g.cs (o RIAServicesPocoExample.Web.g.vb).
Para crear una instancia del elemento
SovereignDomainContext
, agregue la línea de códigoprivate SovereignDomainContext _sovereignContext = new SovereignDomainContext();
en la claseMainPage
.Recupere las entidades Customer llamando al método
GetSovereignsQuery
con LoadOperation:LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));
.Enlace las entidades cargadas al control DataGrid con
SovereignGrid.ItemsSource = loadOp.Entities;
.En resumen, el archivo MainPage.xaml.cs debe contener ahora el código siguiente:
//Namespaces added using RIAServicesPocoExample.Web; using System.ServiceModel.DomainServices.Client; namespace RIAServicesPocoExample { public partial class MainPage : UserControl { private SovereignDomainContext _sovereignContext = new SovereignDomainContext(); public MainPage() { InitializeComponent(); LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500)); SovereignGrid.ItemsSource = loadOp.Entities; } } }
Ejecute (F5) la aplicación.
Debe ver en el explorador una tabla que muestra las propiedades solo de los reyes medievales cuyos reinados finalizaron antes del año 1500 de la era cristiana (en orden alfabético).
Seguridad
Vea también
Tareas
Tutorial: recuperar y mostrar datos de un servicio de dominio