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:

public List<Product> GetProduct(int sku)
{
    
if (!CacheManager.Current.IsCached(sku))
        CacheManager.Current.Add(
            sku, 
            GetProductFromDB(sku), 
            TimeSpan.FromSeconds(20));

    
return CacheManager.Current[sku] as Product;
}

Download: Elite.Utilities.Caching.zip (42 KB)

powered by IMHO 1.3


Commenti (1) -

# | Di .NET e di altre amenita' | 24.03.2006 - 23.24

Aggiungi Commento