RIA Services: Paso a paso (II)

En un post anterior hablaba sobre RIA Services y empecé con un ejemplo sencillo de cómo crear una aplicación con RIA Services.

En este post toca explicar en más detalles algunas de las cosas que vimos en ese post anterior.

Al crear el DomainService aparecía un diálogo como este:

9_thumb1

Si una vez generado el DomainService, vamos al fichero SuppliersService.cs veremos que el código que se ha generado es el siguiente:

[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);
    }
}
 
Es una clase que deriva de LinqToEntitiesDomainService y como característica especial destacar que está decorada con el atributo EnableClientAccess, que es la manera de decir que esta clase tiene que estar accesible desde el proyecto cliente.
 
También observar que se han generado los método típicos de cualquier aplicación guiada por datos. Se han creado los métodos y las llamadas necesarias al modelo de Entity Framework para realizar las opciones CRUD ( Create/Read/Update/Delete).
En este caso, las llamadas son llamadas directas al modelo, pero en esta clase podríamos incluir toda la lógica que consideremos para cubrir la funcionalidad que necesitemos en la aplicación.
 
Por cierto, si en el diálogo de creación del servicio no hubiéramos seleccionado la opción “Enable Editing”, sólo se hubiera creado el método GetSuppliers.
 
Después de generar el servicio y compilar la solución, veremos cómo automáticamente se ha creado el proxy en el cliente. Para poder verlo es necesario seleccionar la opción “Show All Files”.
 
11
 
El atributo EnableClientAccess 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 ).
 
RIA3
 
Fijaros cómo en el cliente se accede a través de SupplierContext y cómo en lugar de llamarse el método GetSuppliers, como está en el DomainService, se llama LoadSuppliers. Este cambio lo hace RIA Services y en un post posterior veremos por qué lo hace.
 
 
 13_thumb3
 
Por completar el ejemplo anterior, vamos a hacer que en el grid de datos sólo se muestren los proveedores que de una determinada ciudad.
 
Para ello, vamos a añadir un nuevo parámetro al método GetSuppliers del servicio de dominio. También añadiremos la sentencia de LINQ to Entities necesaria para obtener la información que nos interesa del modelo.
 
public IQueryable<Suppliers> GetSuppliers(string city)
{
    return (from c in this.Context.Suppliers
            where c.City == city
            select c);
}
 
Una vez realizado este cambio en el cliente tendremos ya accesible el nuevo método con el parámetro, sin hacer nada más.
 
SuppliersContext context = new SuppliersContext();
gridRiaDemo.ItemsSource = context.Suppliers;
context.LoadSuppliers("London");

17

En esta solución hemos modificado el servidor, para que exponga un método con el parámetro por el que queremos filtrar, pero sin cambiar el método GetSuppliers, sin añadir el parámetro, también podríamos usar una sobrecarga que se genera en el proxy cliente para obtener el mismo resultado:

18

Esto es posible porque al generarse el proxy en el cliente no se genera única y exclusivamente el método que exponemos. Por cada método se crean tres sobrecargas distintas en el cliente, que nos permiten cosas como las que acabamos de ver.

Si vemos el código generado veremos lo siguiente:

#region LoadSuppliers method overloads
/// <summary>
/// Invokes the server-side method 'GetSuppliers' and loads the result into <see cref="Suppliers"/>.
/// </summary>
[LoadMethod(typeof(Suppliers))]
public void LoadSuppliers()
{
    this.LoadSuppliers(null, MergeOption.KeepCurrentValues, null);
}

/// <summary>
/// Invokes the server-side method 'GetSuppliers' and loads the result into <see cref="Suppliers"/>.
/// </summary>
[LoadMethod(typeof(Suppliers))]
public void LoadSuppliers(IQueryable<Suppliers> query, object userState)
{
    this.LoadSuppliers(query, MergeOption.KeepCurrentValues, userState);
}

/// <summary>
/// Invokes the server-side method 'GetSuppliers' and loads the result into <see cref="Suppliers"/>.
/// </summary>
[LoadMethod(typeof(Suppliers))]
public void LoadSuppliers(IQueryable<Suppliers> query, MergeOption mergeOption, object userState)
{
    base.Load("GetSuppliers", null, query, mergeOption, userState);
}
#endregion

Y hasta aquí este post, espero poder escribir algún otro prontito para seguir explicando algunos detalles interesantes de RIA Services.

Published 18/6/2009 8:02 por Ibon Landa
Comparte este post:
http://geeks.ms/blogs/ilanda/archive/2009/06/18/ria-services-paso-a-paso-ii.aspx

Comentarios

# 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

Tuesday, June 23, 2009 11:35 PM por Yo sólo pasaba por aquí pero ya que estoy...