Esiste un modo più semplice per memorizzare i dati nella cache

6

Abbiamo iniziato a implementare un codice di memorizzazione nella cache nel nostro progetto MVC. Abbiamo derivato da .Net's ObjectCache per memorizzarlo in un database SQL.

Ciò che facciamo ora è in ogni metodo che vogliamo memorizzare nella cache, abbiamo un codice come questo:

public StatusCounts GetCounts()
{
   var cache = new SqlCache<StatusCounts>("mykey");
   if(cache.HasCachedData())
      return cache.GetCachedData();

   var data = StatusRepository.GetCounts();

   cache.SetData(data, DateTime.Now.AddHours(2));
}

Per quanto riguarda la memorizzazione nella cache, funziona. Ma la mia preoccupazione è che ora sembra che GetCounts abbia più responsabilità. Non si tratta più solo di calcolare i conteggi, ma di recuperarli da una cache (se esistono) e di salvarli in una cache prima di tornare.

C'è un modo più semplice per farlo?

    
posta taylonr 19.02.2013 - 15:49
fonte

3 risposte

7

Puoi separare l'inizializzazione della cache dalla restituzione del valore e implementare l'inizializzazione della cache in un modo generico:

public StatusCounts GetCounts()
{
   var cache = GetInitializedCache<StatusCounts>("mykey",StatusRepository.GetCounts,2);
   return cache.GetCachedData();
}

private SqlCache<T> GetInitializedCache<T>(string key,Function<T> getData,double hours)
{
   var cache = new SqlCache<T>(key);
   if(!cache.HasCachedData())
   {
      T data = getData();
      cache.SetData(data, DateTime.Now.AddHours(hours));
   }
   return cache;
}

Questo separerà le preoccupazioni legate al caching e al calcolo dei valori, oltre a darti una funzione riutilizzabile. Ovviamente, il metodo body di GetCounts è ancora a conoscenza della meccanica di cache, e se vuoi evitare anche questo, la risposta di @ Peri potrebbe essere l'approccio giusto (al prezzo di dover introdurre un componente di terze parti non banale ).

    
risposta data 19.02.2013 - 16:08
fonte
4

Vorrei provare a implementarlo usando AOP. Potresti provare Castle.Windsor's Interceptors o meccanismo che ha un altro contenitore IoC. In questo modo si implementa il caching solo in un punto (Interceptor) e non vi è alcun segno di cache nel metodo.

link

    
risposta data 19.02.2013 - 16:00
fonte
0

Ho creato un piccolo strumento per questo qualche tempo fa, link , che usiamo con successo nel nostro negozio. Utilizza AOP come @Peri descrive dietro le quinte.

Indipendentemente dall'utilizzo di questo o di un altro strumento, sarei favorevolmente favorevole all'AOP per questo. Mentre scrivi te stesso, non dovresti mescolare le responsabilità all'interno delle tue classi (estrai la logica di caching ad un metodo separato non importa IMHO - sposta semplicemente la dipendenza invece di sbarazzartene).

    
risposta data 20.02.2013 - 14:52
fonte

Leggi altre domande sui tag