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

IEnumerable<T>, IQueryable<T> o entidad

Parámetros

Cualquier número de parámetros

Prefijo de nombre

Cualquier nombre

Atributo

[Query] (C#)

O bien

<Query()> (Visual Basic)

Para obtener más información, vea QueryAttribute.

Ejemplo

public IQueryable<Product> GetProducts() (C#)

O bien

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

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

[Update] (C#)

O bien

<Update()> (Visual Basic)

Para obtener más información, vea UpdateAttribute.

Ejemplo

public void UpdateProduct(Product product) (C#)

O bien

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

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

[Insert] (C#)

O bien

<Insert()> (Visual Basic)

Para obtener más información, vea InsertAttribute.

Ejemplo

public void InsertProduct(Product product) (C#)

O bien

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

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

[Delete] (C#)

O bien

<Delete()> (Visual Basic)

Para obtener más información, vea DeleteAttribute.

Ejemplo

public void DeleteProduct(Product product) (C#)

O bien

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

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

[Invoke] (C#)

O bien

<Invoke> (Visual Basic)

Para obtener más información, vea InvokeAttribute.

Ejemplo

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

O bien

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

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

[Update(UsingCustomMethod=true] (C#)

O bien

<Update(UsingCustomMethod:=True)> (Visual Basic)

Para obtener más información, vea UpdateAttribute.

Ejemplo

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

O bien

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

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.

Vea también

Conceptos

DomainContext y operaciones
Seguridad para WCF RIA Services