RIA Services: Sobre la generación de código…

En dos anteriores veíamos un ejemplo de cómo funciona RIA Services y de cómo nos puede facilitar la creación de aplicaciones RIA.

En el ejemplo veíamos cómo al crear el DomainService usando la entidad Suppliers se generaba el código que pongo a continuación y cómo de manera automática se generaban las clases proxys en el cliente que posibilitan que se puede acceder fácilmente desde el cliente al servidor.

[EnableClientAccess()]
public class SuppliersService : LinqToEntitiesDomainService<NorthwindEntities>
{
    public IQueryable<Suppliers> GetSuppliers()
    {
        return this.Context.Suppliers;
    }

    public void InsertSuppliers(Suppliers suppliers)
    {
        this.Context.AddToSuppliers(suppliers);
    }

    public void UpdateSuppliers(Suppliers currentSuppliers, Suppliers originalSuppliers)
    {
        this.Context.AttachAsModified(currentSuppliers, originalSuppliers);
    }

    public void DeleteSuppliers(Suppliers suppliers)
    {
        if ((suppliers.EntityState == EntityState.Detached))
        {
            this.Context.Attach(suppliers);
        }
        this.Context.DeleteObject(suppliers);
    }
}

El atributo EnableClientAccess que lleva la clase y el hecho de que ambos proyectos “estén unidos” hace que al crear o cambiar los servicios del servidor ( DomainService ) se creen los proxys necesarios en el cliente ( DomainContext ).

El proceso de generación de código automático es capaz de examinar todos los ensamblados del proyecto servidor buscando las clases marcadas con el atributo EnableClientAccess y buscar dentro de esta clase las entidades y operaciones expuestas.

Una cosa que no habíamos mencionado hasta ahora, es que el nombre de los métodos que se incluyen no es un nombre al azar y siguen una nomenclatura fija. En el código superior se puede ver cómo es el código.

A continuación pongo las reglas que sigue:

  • Operación Select.
    • IQueryable<Entity> GetXXX ( )
    • Debe empezar con los prefijos Get, Fetch, Find, Query, Retrieve o Select.
    • En el cliente cualquiera de los prefijos se cambia a Load.
  • Operación de inserción.
    • InsertXXX ( NewEntity )
    • Debe empezar con prefijos Insert, Add o Create.
    • NewEntity es el tipo de la entidad nueva que se añade.
    • Siempre devuelve void.
  • Operación de actualización.
    • UpdateXXX ( changedEntity, originalEntity )
    • Debe empezar con los prefijos Update, Change o Modify.
    • changedEntity es la entidad con los cambios y originalEntity la original.
  • Operación de borrado.
    • DeleteXXX ( Entity )
    • Debe empezar con los prefijos Update o Remove.
    • Entity es el tipo de la entidad sobre la que realiza la operación.

En el caso de la operación Select al generar el proxy cliente ya veíamos en el ejemplo anterior cómo los método cambian el prefijo por la palabra Load.

[LoadMethod(typeof(Suppliers))]
public void LoadSuppliers()
{
    this.LoadSuppliers(null, MergeOption.KeepCurrentValues, null);
}

Si queremos que no haga ninguna modificación y que mantenga el nombre que ponemos en el servidor, podemos conseguirlo usando el atributo PreserveName.

[Query(PreserveName=true)]
public IQueryable<Suppliers> GetSuppliers()
{
    return this.Context.Suppliers;
}

¿Y qué pasa si quiero usar mis propios nombres? Pues que también puedes, pero usando atributos para indicar la operación que ofrece el método.

Los atributos que se usan son Get, Insert, Update o Delete. De esta manera, aunque el método se llama diferente, el generador de código sabrá de qué operación se trata y que tiene que hacerla accesible desde el cliente.

[Query]
public IQueryable<Suppliers> MyMethodGet()
{
    return this.Context.Suppliers;
}
[Insert]
public void MyMethodInsert(Suppliers suppliers)
{
    this.Context.AddToSuppliers(suppliers);
}

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

4 comentarios en “RIA Services: Sobre la generación de código…”

  1. Acuerdate en tus oraciones de la aplicación de los ejemplos de Silverlight a un sitio web en vez de un proyecto web.

    Información certera y concisa.

    Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *