ASP.NET supporta la cache dependencies; questa feature permette di relazionare un oggetto che abbiamo in cache con un'altra risorsa, in modo tale che, quando questa risorsa cambia, l'oggetto in cache verrà rimosso automaticamente.
Esistono tre tipi di dipendenza:
- Con un'altro oggetto in cache
- Con un file o una directory
- Query su database
Per creare una dipendenza nella cache, bisognerà creare un oggetto CacheDependency ed usarlo quando inseriremo un oggetto in cache.
Per esempio, il codice seguente, creerà una dipendenza con un file XML.
Se il file verrà cambiato, cancellato o sovrascritto, l'oggetto in cache scadrà:
CacheDependency prodDependency = new CacheDependency(Server.MapPath("ProductList.xml"));
Cache.Insert("ProductInfo", prodInfo, prodDependency);
Se avessimo creato una dipendenza su una directory, l'oggetto CacheDependency avrebbe controllato se un file viene aggiunto, modificato, cancellato o se una sotto-directory viene rinominata, creata o rimossa.
I cambiamenti che occorranno un livello inferiore a quello della subdirectory (inserimento di un file in una subdirectory o la creazione di una subdirectory in una subdirectory), non verranno notificati.
|
L'oggetto CacheDependency creato, inizierà la sua fase di controllo immediatamente, senza attendere che venga associato ad un oggetto in cache.
|
Più Dipendenze
Potrebbe tornare necessario un oggetto CacheDependency che dipende da più risorse (la modifica di due files decreta l'invalidità dell'oggetto in cache).
In questo caso avremo bisogno di creare un oggetto AggregateCacheDependency:
CacheDependency dep1 = new CacheDependency(Server.MapPath("ProductList1.xml"));
CacheDependency dep2 = new CacheDependency(Server.MapPath("ProductList2.xml"));
CacheDependency[] deps = new CacheDependency[] { dep1, dep2 };
AggregateCacheDependency aggregateDep = new AggregateCacheDependency();
aggregateDep.Add(deps);
Cache.Insert("ProductInfo", prodInfo, aggregateDep);
Questo è soltanto un esempio, in quanto l'oggetto CacheDependency può accettare un array di files.
AggregateCacheDependency torna utile nel caso in cui gli oggetti da controllare non sono solamente files.
Riferendoci al post Data Caching, in questi casi torna utile l'utilizzo del delegate onRemoveCallback. Tramite questo delegate potremmo controllare perchè l'oggetto è stato rimosso, se perchè una delle sue dipendenze è cambiata o se per qualche altro motivo.
ASP.NET mette a disposizione l'enum CacheItemRemovedReason per capire perchè il nostro oggetto è stato rimosso dalla cache.