2011-09-18 17 views
7

Necesito rellenar algunos cuadros desplegables de algunos datos de referencia. es decir, Lista de ciudades, Lista de países, etc. Necesito completarla en varios formularios web. Creo que deberíamos almacenar estos datos en caché en nuestra aplicación para que no golpeemos la base de datos en todos los formularios. Soy nuevo en el almacenamiento en caché y ASP.Net. Por favor sugiereme cómo hacer esto.Caché de datos en ASP.Net

Respuesta

13

Siempre agrego la siguiente clase a todos mis proyectos que me dan fácil acceso al objeto Cache. Implementar esto, siguiendo la respuesta de Hasan Khan sería un buen camino a seguir.

public static class CacheHelper 
    { 
     /// <summary> 
     /// Insert value into the cache using 
     /// appropriate name/value pairs 
     /// </summary> 
     /// <typeparam name="T">Type of cached item</typeparam> 
     /// <param name="o">Item to be cached</param> 
     /// <param name="key">Name of item</param> 
     public static void Add<T>(T o, string key, double Timeout) 
     { 
      HttpContext.Current.Cache.Insert(
       key, 
       o, 
       null, 
       DateTime.Now.AddMinutes(Timeout), 
       System.Web.Caching.Cache.NoSlidingExpiration); 
     } 

     /// <summary> 
     /// Remove item from cache 
     /// </summary> 
     /// <param name="key">Name of cached item</param> 
     public static void Clear(string key) 
     { 
      HttpContext.Current.Cache.Remove(key); 
     } 

     /// <summary> 
     /// Check for item in cache 
     /// </summary> 
     /// <param name="key">Name of cached item</param> 
     /// <returns></returns> 
     public static bool Exists(string key) 
     { 
      return HttpContext.Current.Cache[key] != null; 
     } 

     /// <summary> 
     /// Retrieve cached item 
     /// </summary> 
     /// <typeparam name="T">Type of cached item</typeparam> 
     /// <param name="key">Name of cached item</param> 
     /// <param name="value">Cached value. Default(T) if item doesn't exist.</param> 
     /// <returns>Cached item as type</returns> 
     public static bool Get<T>(string key, out T value) 
     { 
      try 
      { 
       if (!Exists(key)) 
       { 
        value = default(T); 
        return false; 
       } 

       value = (T)HttpContext.Current.Cache[key]; 
      } 
      catch 
      { 
       value = default(T); 
       return false; 
      } 

      return true; 
     } 
    } 
+0

Nice coding ... upvoted –

2

Por otra cuestión suya, leí que está utilizando arquitectura de 3 capas con dal, negocio y capa de presentación.

Así que supongo que tiene alguna clase de acceso a datos. Lo ideal sería tener una implementación en caché de la misma clase y almacenarla en caché.

Por ejemplo: si tiene una interfaz IUserRepository entonces la clase UserRepository lo implementaría y agregará/eliminará/actualizará las entradas en db a través de los métodos, también puede tener CachedUserRepository que contendrá la instancia del objeto UserRepository y en los métodos get primero verá en la memoria caché contra alguna clave (derivada de los parámetros del método) y si se encuentra el elemento, lo devolverá; de lo contrario, se llama al método en el objeto interno; obtener los datos; agregar a la caché y luego devolverlo.

Su CachedUserRepository también tendrá una instancia de objeto de caché obviamente. Puede mirar http://msdn.microsoft.com/en-us/library/18c1wd61(v=vs.85).aspx para obtener detalles sobre cómo usar el objeto Cache.

+1

... y solo para cultura general/vocabulario, esto se llama el patrón "Decorador". Es decir, "decora" el repositorio inicial con una funcionalidad adicional que implementa el almacenamiento en caché. – tsimbalar

Cuestiones relacionadas