14

Sto utilizzando la nuova API di caching .NET 4.0, ObjectCache. Ho fatto alcune domande su questo argomento negli ultimi giorni e ho accennato a questo problema, ma ho pensato che valesse la pena di scomporlo nella sua stessa domanda.Sicurezza thread e gestione dell'oscilloscopio per .NET 4.0 ObjectCache

Poiché la classe è astratta e tutti i metodi sono virtuali, ciò significa che possiamo creare i nostri provider di cache personalizzati.

Secondo MSDN, ObjectCache non deve essere un singleton ed è possibile crearne più istanze nell'applicazione.

Ma a me sembra che dobbiamo gestire anche l'istanziazione e la durata di questo oggetto?

Possiedo un'applicazione Web ASP.NET MVC 3, con StructureMap come contenitore di input delle dipendenze.

Voglio avere una cache singola, condivisa per la mia intera applicazione web.

Quindi, creo una classe molto semplice che avvolge la classe ObjectCache e fornisce l'unboxing nell'implementazione dei metodi.

La classe prende un'istanza ObjectCache nel ctor, e imposta a un un'istanza statica privata della cache, che i metodi (Aggiungi, Get, ecc) lavorare fuori.

Eg

public class CacheManager 
{ 
    private static ObjectCache _cache; 

    public CacheManager(ObjectCache cache) 
    { 
     _cache = cache; 
    } 

    // Add, Get, Remove methods work off _cache instance. 
} 

Ora, ecco il mio registro DI:

For<CacheManager>().Singleton().Use<CacheManager>().Ctor<ObjectCache>("cache").Is(MemoryCache.Default); 

In inglese: Quando qualcosa richiede un'istanza CacheManager, utilizzare un'istanza Singleton, e impostare il parametro ObjectCache di essere un Istanza di MemoryCache.

Quindi c'è quello che ho, ora le domande:

  1. Se ho una classe per avvolgere il ObjectCache, fa questa classe bisogno di essere un Singleton?
  2. MSDN dice ObjectCache thread-safe, ma ora che sto usando un singleton, ho bisogno di qualsiasi tipo di blocco per mantenere la sicurezza del thread?
  3. L'istanza privata di ObjectCache nella mia classe wrapper deve essere statica? La classe stessa deve essere statica?
  4. Considerazioni generali sulla mia implementazione generale?

Non sono stato in grado di trovare un blog/articolo decente su .NET ObjectCache nelle applicazioni Web ASP.NET, quindi la mia confusione.

Sono abituato a utilizzare HttpContext.Current.Cache (che è statico) e non mi interessa la gestione della durata per la cache.

risposta

6
  1. Poiché MemoryCache.Default è un singleton, la tua classe senza stato non ha realmente bisogno di esserlo. Tuttavia, dipende completamente da te.
  2. Non è necessario il blocco attorno all'istanza di ObjectCache.
  3. No, e No. Rendendolo statico non fornisce alcun valore. Indicare che si tratta di un singleton in StructureMap fa sì che lo GetInstance<>() restituisca sempre lo stesso oggetto.
  4. Il valore reale del wrapping ObjectCache dovrebbe essere astratto dell'implementazione della cache in modo che sia possibile modificarlo o deriderlo. Senza un'interfaccia questo diventa meno utile.

un esempio di implementazione di seguito ...

public interface ICacheManager 
{ 
    // add, get, remove, etc 
} 

public class CacheManager : ICacheManager 
{ 
    private static ObjectCache _cache; 

    public CacheManager(ObjectCache cache) 
    { 
     _cache = cache; 
    } 

    // Add, Get, Remove methods work off _cache instance. 
} 

Poi ...

For<ICacheManager>() 
    .Singleton() 
    .Use<CacheManager>(); 

For<ObjectCache>() 
    .Use(MemoryCache.Default); 

Se si desidera cambiare voi fornitore di cache che è ancora un ObjectCache in futuro, allora è facile da regolare.

Spero che questo aiuti!

+0

Questa è la risposta che stavo cercando. Grazie. A proposito: cosa ti fa pensare che 'MemoryCache.Default' sia un singleton? – RPM1984

+0

Inoltre, normalmente userei un'interfaccia, ma 'ObjectCache' è la mia interfaccia, in quanto è una classe astratta. Quindi, se voglio passare a un altro provider di cache, cambio semplicemente il tipo di 'ObjectCache' viene iniettato nel ctor della classe CacheManager. – RPM1984

+0

@Travis - eventuali commenti a quanto sopra? – RPM1984