Chi come me sviluppa in ambiente web, è abituato a fare uso, talvolta
anche abuso della Cache che il runtime http integra nel framework ASP.NET. Non
tutti sanno però che questa cache, può essere abbastanza facilmente essere usata
anche in applicazioni Windows Forms. In soldoni è sufficiente creare un runtime
http fittizio che supporti adeguatamente la cache e il gioco è fatto.
In realtà si tratta di un trucco abbastanza vecchio e
conosciuto, ma quest'oggi ho finalmente deciso di risolvere con problema in modo
definitivo. Il fatto è che spesso è utile incapsulare il caching
all'interno di classi che poi possono trovare utilità
indifferentemente in applicazioni WebForms o WindowsForms. Perciò sarebbe
utile avere una cache che si adegui al contesto in cui viene istanziata in modo
trasparente. Vi propongo perciò in allegato a questo post il codice che ho
realizzato, accompagnato da uno schema tratto dal class diagram di Visual Studio
2005 per esporvi la soluzione.
Le tre classi che potete vedere a fianco pur nella loro
semplicità fanno uso di due Design Pattern. Il CacheManager si comporta
da un lato come una Abstract Factory, consentendo di istanziare
con il metodo statico Create() un'istanza concreta dedicata
all'ambiente in cui il processo è in esecuzione. Il test è molto semplice: se è
presente un HttpContext verrà istanziato l'HttpCacheManager,
in caso contrario la scelta ricaderà sul WinFormsCacheManager. La
classe CacheManager inoltre è un Singleton. Essa espone una proprietà
Current la quale rende disponibile il CacheManager corretto istanziato
per mezzo di Create(). Questa organizzazione consente di avere accesso alla
cache adatta al contesto per mezzo di una sola riga di codice:
object cached = CacheManager.Current["cachedObject"];
La classe concreta che implementa il CacheManager espone una
serie di proprietà e metodi molto comodi. Add() che consente di aggiungere un
item in cache, e IsCached che data una chiave verifica se essa è già presenti in
cache. Quest'ultimo metodo permete di scrivere qualcosa del genere: