11 de junio de 2010

Caché Web con CacheDependency en ASP.NET (C#)

Veamos un ejemplo práctico de como implementar el trabajo con Cache en ASP.NET usando HttpRuntime.Cache (System.Web.Caching.Cache).

Si estamos desarrollando una Aplicación Web con ASP.Net y deseamos implementar y usar Caché, este tutorial te será de utilidad. Existen varias soluciones para implementar el trabajo con Caché (AppFabric, EnterpriseLibrary.Caching, y otras que no vienen a caso ...), nuestro propósito es implementar nuestra propia lógica de Caché usando la clase Cache presente en el ensamblado System.Web.dll.

Adicionalmente crearemos una relación de dependencia entre el elemento almacenado en Caché y su correspondiente archivo en disco, pero de esto hablaremos mas adelante, de momento pasemos al código.

HttpRuntime.Cache & CacheDependency, Ejemplo de Código

Lo que haremos serán 2 métodos:

  1. Put: Escribir un objeto en Caché, y crear además una relación de dependencia con un archivo que también escribiremos en disco.
  2. Get: Leer un objeto de la Caché.

public static class MiAppCacheDependency

{

  public static bool Put(Object obj, string nameCache)

  {

    try

    {

      string filePathFullName = @"C:\Cache\" + nameCache + ".xml";

     

      File.WriteAllText(filePathFullName, obj.Serializa());

      // Crear la dependencia de la cache con el archivo 

      HttpRuntime.Cache.Insert(nameCache, obj, new CacheDependency(filePathFullName));

    }

    catch

    {

      throw new Exception("Error al escribir en cache, posiblemente no            

                           exista la carpeta CacheDependency.");

    }

    return true;

  }

 

  public static T Get<T>(string nameCache)

  {

    try

    {

      object cache = HttpRuntime.Cache[nameCache];

      if (cache == null) return default(T);

      return (T)cache;

    }

    catch { return default(T); }

  }

}

 

Veamos ahora como usar estos métodos. Imaginemos que tenemos una clase (Aerolíneas) para la gestión de las distintas aerolíneas. En esta clase tendremos:

  1.  CacheKey: Una propiedad de la clase que contendrá el nombre con que guardaremos las aerolíneas en la Caché.
  2. CacheGet: Un método que leerá las aerolíneas desde la caché, si estas no estuvieran, las leerá de la base de datos y la colocará en la caché.
  3. CachePut: Un método que escribirá las distintas aerolíneas en la caché.

namespace dllMiApp.Aerolineas

{

  /// <summary>

  /// Clase para la gestión de los Aerolineas

  /// </summary>

  public partial class Aerolineas

  {

    private static string CacheKey = "Aerolineas";

    /// <summary> 

    /// Escribe o inserta en cache las aerolíneas 

    /// </summary> 

    public static bool CachePut(List<Aerolinea> lstAerolineas)

    {

      return MiAppCacheDependency.Put(lstAerolineas, CacheKey);

    }

    /// <summary>

    /// Lee las aerolíneas desde cache. Sino existiera en chache, las lee de la BD

    /// </summary>

    public static List<Aerolinea> CacheGet()

    {

      List<Aerolinea> lstAerolineas = MiAppCacheDependency.Get<List<Aerolinea>>(CacheKey);

      if (lstAerolineas == null)

      {

        lstAerolineas = Aerolineas.GetAerolineasValidas();

        CachePut(lstAerolineas);

      }

     

      return lstAerolineas;

    }

  }

}

Nota: En los distintos métodos que actualicen las aerolíneas, deberíamos actualizar también su valor en la caché. Al existir una relación de dependencia entre la caché y un archivo en disco, garantizamos que al modificar la caché a través de una aplicación, todas las demás aplicaciones que usen la dependencia, se enterarán de la modificación.

 

Artículos Relacionados:

No hay comentarios:

Publicar un comentario