Servicios de dominio
Los servicios de dominio son servicios de Windows Communication Foundation (WCF) que encapsulan la lógica de negocios de una aplicación de WCF RIA Services. Un servicio de dominio expone un conjunto de operaciones relacionadas en forma de una capa de servicio. Cuando se define un servicio de dominio, se deben especificar las operaciones de datos permitidas a través del servicio de dominio.
Cuando se diseña un servicio de dominio, se debe pensar en el servicio de dominio como un conjunto de tareas relacionadas que se espera que los usuarios realicen en la aplicación. Normalmente, dichas tareas afectan a un grupo pequeño de entidades estrechamente relacionadas. Por ejemplo, en una aplicación de informes de gastos, se pueden exponer entidades para informes de gastos, elementos de línea y detalles. A continuación, se pueden colocar entidades para cuentas y pagos en un servicio de dominio independiente.
Servicios de dominio y sus orígenes de datos
La clase DomainService es la clase base para todas las clases que actúan como servicios de dominio. Para crear un servicio de dominio que enlaza a un objeto de datos personalizado, debe crear una clase que derive directamente de DomainService. Pero si tiene un servicio de dominio que enlaza un Entity Data Model de ADO.NET o que expone un vínculo a una base de datos SQL, puede utilizar en su lugar clases abstractas especiales que derivan de DomainService.
Para crear un servicio de dominio que enlaza a un Entity Data Model de ADO.NET, debe crear una clase que derive de LinqToEntitiesDomainService. RIA Services proporciona la clase LinqToEntitiesDomainService.
Si desea crear un servicio de dominio que exponga clases de LINQ to SQL en la aplicación, debe crear una clase que derive de LinqToSqlDomainService. Esta clase se proporciona en el Kit de herramientas de RIA Services. Si desea crear un servicio de dominio que exponga clases de LINQ to SQL en la aplicación utilizando esta clase, debe descargar el Kit de herramientas de RIA Services .
Cuando se utiliza el cuadro de diálogo Agregar nueva clase de servicio de dominio para crear un servicio de dominio, el tipo de servicio de dominio que se crea está basado en las entidades que se exponen.
Una clase de servicio de dominio se debe marcar con el atributo EnableClientAccessAttribute para que el servicio esté disponible para el proyecto de cliente. El atributo EnableClientAccessAttribute se aplica automáticamente al servicio de dominio cuando se activa la casilla Habilitar acceso de cliente del cuadro de diálogo Agregar nueva clase de servicio de dominio. Cuando se aplica el atributo EnableClientAccessAttribute a un servicio de dominio, RIA Services genera las clases correspondientes para el proyecto de cliente. Por ejemplo, cuando se aplica el atributo EnableClientAccessAttribute a un servicio de dominio denominado HRService
que expone una entidad denominada Employee
, RIA Services genera un contexto de dominio denominado HRContext
en el proyecto de cliente y una versión de cliente de la entidad Employee
.
WCF y servicios de dominio
Como servicio de Windows Communication Foundation (WCF), el servicio de dominio se basa en los conceptos de WCF. El servicio de dominio conserva las funciones siguientes:
Uso estándar de servicios de WCF
Existencia de estructuras de modelos de programación de WCF, como contratos de operación, comportamientos de operación y comportamientos de servicio
Capacidades de personalización de WCF estándar, como configuración de enlace, configuración de comportamiento e infraestructura de administración
El contexto de dominio se comunica con el servicio de dominio de RIA Services utilizando el elemento ChannelFactory de WCF para crear un canal y pasarle un contrato de servicio generado desde el servicio de dominio.
De forma predeterminada, solo el extremo binario está habilitado para servicios de dominio. Para utilizar el extremo binario no se necesita ninguna configuración adicional. Si desea utilizar otro extremo (como OData, JSON, SOAP o un host personalizado) debe registrar un generador de extremos en el archivo Web.config como se muestra a continuación:
<configSections>
<sectionGroup name="system.serviceModel">
<section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
</sectionGroup>
</configSections>
<system.serviceModel>
<domainServices>
<endpoints>
<add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
</endpoints>
</domainServices>
<system.serviceModel>
El espacio de nombres System.ServiceModel.DomainServices.Hosting contiene los extremos que se admiten en RIA Services . El espacio de nombres Microsoft.ServiceModel.DomainServices.Hosting contiene los extremos que se admiten con el Kit de herramientas de RIA Services , como el elemento JsonEndpointFactory que se muestra en el ejemplo anterior. Para crear un extremo personalizado, debe crear una clase que derive de la clase DomainServiceEndpointFactory y reemplazar el método CreateEndpoints.
Operaciones de datos
Puede agregar métodos a un servicio de dominio que realicen la operación de datos que desee exponer. Por ejemplo, puede agregar métodos que realicen las siguientes operaciones:
Query
Update
Insert
Delete
También puede agregar operaciones más complicadas como:
Invoke: para implementar operaciones que necesitan ejecutarse sin seguimiento ni aplazamiento. Este método se utiliza únicamente con datos que no sean de entidad y solo cuando no se puedan usar operaciones de consulta, actualización, inserción o eliminación en su lugar.
Named Update: para implementar operaciones personalizadas que no pertenecen a operaciones de modificación simples.
Cuando se expone un servicio de dominio, se genera un objeto EntitySet en el contexto de dominio con propiedades que indican qué operaciones (inserción, actualización o eliminación) se permiten en el cliente. Las modificaciones de datos se ejecutan modificando la colección de entidades y llamando después al método SubmitChanges.
En casi todos los escenarios, se deben usar operaciones de consulta en lugar de operaciones de invocación para la carga de datos. Los métodos de consulta devuelven un solo objeto Entity, un objeto IQueryable<Entity> o un objeto IEnumerable<Entity>. Los métodos de consulta forman parte integral del patrón de datos admitido por DomainService en el nivel intermedio y por DomainContext en el cliente. El marco de RIA Services genera entidades en el proyecto de cliente solo para las entidades devueltas por los métodos de consulta de un elemento DomainService.
Las operaciones de invocación proporcionan un mecanismo fuera de banda para devolver datos que no son de entidad y ejecutar operaciones con efectos secundarios. Para obtener más información sobre los efectos secundarios, vea la propiedad HasSideEffects. Las operaciones de invocación no son normalmente adecuadas para los métodos de consulta. Incluso cuando una operación de invocación devuelve una entidad, la entidad se genera para el proyecto de cliente únicamente si la devuelve un método de consulta.
Convenciones
Cuando se agregan métodos para realizar estas operaciones, el método debe coincidir con la signatura esperada para esa operación. Además de coincidir con la signatura, el método debe incluir un prefijo de nombre que coincida con la convención de nomenclatura para esa operación de datos. Si el nombre del método no se inicia con el prefijo esperado, se debe aplicar el atributo correspondiente para esa operación. El atributo es opcional si el nombre de la operación coincide con la convención de nomenclatura. El uso de la convención de nomenclatura proporciona una experiencia más sólida para los desarrolladores.
No se pueden sobrecargar métodos que sean operaciones de dominio. Se debe especificar un nombre único para cada método que se pueda invocar desde el proyecto de cliente. Todos los métodos que representan operaciones de servicio de dominio deben ser públicos. Los métodos deben utilizar tipos serializables para los parámetros y los tipos de valor devueltos.
Puede evitar que un método se exponga agregando el atributo IgnoreAttribute al método.
Las signaturas de operación de datos se proporcionan en las tablas siguientes.
Consulta
Un método de consulta debe devolver una instancia única de una entidad o un elemento IEnumerable o IQueryable donde T es un tipo de entidad válido. Dado que no se permiten métodos sobrecargados, se debe proporcionar un nombre único para cada método que tome parámetros de entrada diferentes (por ejemplo GetEmployees()
y GetEmployeesByLastName(string lastname)
.
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de consulta.
Valor devuelto |
|
Parámetros |
Cualquier número de parámetros |
Prefijo de nombre |
Cualquier nombre |
Atributo |
O bien
Para obtener más información, vea QueryAttribute. |
Ejemplo |
O bien
|
Actualización
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de actualización.
Valor devuelto |
Ninguno |
Parámetros |
Entity |
Prefijo de nombre |
Update, Change o Modify |
Atributo |
O bien
Para obtener más información, vea UpdateAttribute. |
Ejemplo |
O bien
|
Inserción
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de inserción.
Valor devuelto |
Ninguno |
Parámetros |
Entity |
Prefijo de nombre |
Insert, Add o Create |
Atributo |
O bien
Para obtener más información, vea InsertAttribute. |
Ejemplo |
O bien
|
Eliminación
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de eliminación.
Valor devuelto |
Ninguno |
Parámetros |
Entity |
Prefijo de nombre |
Delete o Remove |
Atributo |
O bien
Para obtener más información, vea DeleteAttribute. |
Ejemplo |
O bien
|
Invocación
Las operaciones de invocación proporcionan un mecanismo fuera de banda para devolver datos que no son de entidad y ejecutar operaciones con efectos secundarios. Para obtener más información sobre los efectos secundarios, vea la propiedad HasSideEffects. Las operaciones de invocación no son normalmente adecuadas para los métodos de consulta.
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de invocación.
Valor devuelto |
Cualquiera |
Parámetros |
Cualquier número de parámetros |
Prefijo de nombre |
Cualquiera |
Atributo |
O bien
Para obtener más información, vea InvokeAttribute. |
Ejemplo |
O bien
|
Actualización con nombres
En la tabla siguiente se enumeran los valores de signatura esperados para una operación de actualización con nombres.
Valor devuelto |
Ninguno |
Parámetros |
Entity Cualquier número de parámetros distintos |
Prefijo de nombre |
Cualquier nombre que no empiece con los prefijos para Insert, Update o Delete |
Atributo |
O bien
Para obtener más información, vea UpdateAttribute. |
Ejemplo |
O bien
|
Agregar lógica de aplicación a un servicio de dominio
Después de definir la operación de datos expuesta, puede agregar la lógica de aplicación necesaria a la clase de servicio de dominio. El código generado por el asistente solo está previsto para ayudarle a empezar a escribir la lógica de aplicación. Puede agregar la lógica directamente en los métodos de operación o agregarla a los métodos que se invocan desde los métodos de operación. Puede agregar parámetros a métodos existentes, personalizar la implementación de métodos o agregar los nuevos métodos para proporcionar la funcionalidad requerida por la aplicación. Para obtener más información sobre cómo implementar lógica de negocios, vea Agregar lógica de negocios al servicio de dominio.
Cuando se implementa un servicio de dominio, debe tener muy en cuenta los riesgos que para la seguridad supone la exposición de datos a través de un servicio. Para obtener más información sobre la seguridad, vea Seguridad para WCF RIA Services.