Monday, October 5, 2009

Caching - System.Web.Caching.CacheDependency

ASP.NET ci da la possibilità di creare le nostre CacheDependecy, facendo derivare la nostra classe dalla CacheDependecy.
Grazie a questa classe abbiamo possiblità di creare una dipendenza anche per un web service da noi creato.
Il processo è alquanto semplice, bisogna creare una classe che deriva dalla CacheDependecy e far partire un processo asincrono che controllerà se le dipendenze sono cambiate. Se queste cambiano, chiameremo il metodo CacheDependency.NotifyDependencyChange() in automatico la classe CacheDependecy aggiornerà le proprietà HasChanged e UtcLastModified.
Le tecniche più usate per implementare il controllo delle risorse sono 3:
  1. Timer: un timer che effettua un poll sulle risorse
  2. Thread: un thread che controllerà le nostre risorse
  3. Event: quando l'evento viene scaturito, si controllano le risorse

Ecco un semplice esempio usando un Timer:

public class TimerTestCacheDependency : System.Web.Caching.CacheDependency
{
private System.Threading.Timer timer;
private const int pollTime = 5000;

public TimerTestCacheDependency()
{
timer = new System.Threading.Timer(new System.Threading.TimerCallback(CheckDependencyCallback), this, 0, pollTime);
}

private int count = 0;

private void CheckDependencyCallback(object sender)
{
count++;
if (count > 4)
{
base.NotifyDependencyChanged(this, EventArgs.Empty);
timer.Dispose();
}
}

protected override void DependencyDispose()
{
if (timer != null)
timer.Dispose();
}
}


L'esempio è semplicissimo.
Il timer controllerà il valore di count quando questo è maggiore a 4 verrà notificato che la risorsa è cambiata, tramite la base.NotifyDependencyChanged.

E' importante fare l'override del metodo DependencyDispose per togliere quello che più non serve una volta che l'oggetto in cache è stato invalidato.
L'utilizzo è lo stesso di tutti gli altri Dependency:

TimerTestCacheDependency dependency = new TimerTestCacheDependency();
Cache.Insert("key", item, dependency);

Customizzare la Dependency, può tornare molto utile con i nostri servizi WCF o servizi quali Active Directory, Microsoft Messaging Queuing (MSMQ) e tanti altri servizi.

No comments:

Post a Comment