2011-09-18 24 views
7

Ho bisogno di compilare alcuni box dropdown da alcuni dati di riferimento. Elenco delle città, Elenco dei paesi, ecc. Devo riempirlo in varie forme web. Penso che dovremmo memorizzare nella cache questi dati nella nostra applicazione in modo tale da non colpire il database su ogni modulo. Sono nuovo al caching e ASP.Net. Per favore suggeriscimi come fare questo.Caching dei dati in ASP.Net

risposta

13

Aggiungo sempre la classe seguente a tutti i miei progetti che mi consentono di accedere facilmente all'oggetto Cache. L'implementazione di questo, seguendo la risposta di Hasan Khan sarebbe un buon modo per andare.

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

Da un'altra tua domanda ho letto che stai usando un'architettura a 3 livelli con livelli dal, business e presentazione.

Quindi presumo che tu abbia qualche classe di accesso ai dati. La cosa ideale da fare sarebbe avere un'implementazione memorizzata nella cache della stessa classe e fare il caching in questo.

Esempio: Se avete un IUserRepository un'interfaccia allora classe UserRepository sarebbe implementarla e aggiungere/eliminare le voci/aggiornamento su db tramite metodi allora si può anche avere CachedUserRepository che conterrà istanza di oggetto UserRepository e ottenere metodi cercherà prima nella cache contro qualche chiave (derivata dai parametri del metodo) e se l'oggetto viene trovato, lo restituirà altrimenti chiamerai il metodo sull'oggetto interno; ottenere i dati; aggiungere alla cache e quindi restituirlo.

Anche il tuo CachedUserRepository avrà un'istanza di oggetto cache ovviamente. È possibile consultare http://msdn.microsoft.com/en-us/library/18c1wd61(v=vs.85).aspx per i dettagli su come utilizzare l'oggetto Cache.

+1

... e solo per cultura generale/vocabolario, questo è chiamato il modello "Decoratore". Cioè, "decorerai" il repository iniziale con un functionaility aggiuntivo che implementa il caching. – tsimbalar

Problemi correlati