DevTips.NET

Generieke Cachehelper

Het ophalen en opslaan van gegevens in cache moet in webapplicaties expliciet (imperatief) gebeuren. Met de hier getoonde Cache-klasse is het mogelijk om variabelen op een code-efficiënte manier via cache te vullen. De aanroep is als volgt:

var twitterFeed = Cache.TryCache<TwitterFeed>(() => GetTwitterFeed("BuienradarNL"), "twitterBuienradarNL", 10); 
Het object twitterFeed wordt nu opgehaald uit ofwel cache, ofwel via de methode GetTwitterFeed("BuienradarNL"). Als het object niet in cache zit, wordt deze voor 10 minuten opgeslagen onder de sleutel "twitterBuienradarNL".
C#

Code

using System; 
using System.Collections.Generic; 
using System.Web;

public static class Cache     
{
         /// <summary>
         /// Probeer data uit cache te halen. Zit data niet in cache,
         /// voer methode uit die de data uit de bron ophaalt. Deze wordt
         /// daarna in cache geplaatst.
         /// </summary>
         /// <typeparam name="T">type van de data</typeparam>
         /// <param name="method">methode om de data op te halen</param>
         /// <param name="key">sleutel voor opslag in cache</param>
         /// <param name="minutes">aantal minuten opslag</param>
         /// <returns>gevraagde data uit cache of bron</returns>
         public static T TryCache<T>(Func<T> method, string key, double minutes)
         {
             T cachedObject = FromCache<T>(key);
             if (EqualityComparer<T>.Default.Equals(cachedObject, default(T)))
             {
                 method().ToCache<T>(key, minutes);
             }
             return FromCache<T>(key);
         }

         /// <summary>
         /// Voeg data aan cache toe
         /// </summary>
         /// <typeparam name="T">type van de data</typeparam>
         /// <param name="value">data om te cachen</param>
         /// <param name="key">sleutel voor opslag in cache</param>
         /// <param name="minutes">aantal minuten opslag</param>
         public static void ToCache<T>(this T value, string key, double minutes)
         {
             HttpContext.Current.Cache.Insert(key, value, null, DateTime.Now.AddMinutes(minutes),
                  System.Web.Caching.Cache.NoSlidingExpiration);
         }

         /// <summary>
         /// Haal data uit cache
         /// </summary>
         /// <typeparam name="T">type van de data</typeparam>
         /// <param name="key">sleutel voor opslag in cache</param>
         /// <returns>gevraagde data uit cache</returns>
         public static T FromCache<T>(string key)
         {
             return SafeConvert(HttpContext.Current.Cache[key], default(T));
         }

         /// <summary>
         /// Converteer op een typesafe manier een object
         /// </summary>
         /// <typeparam name="T">type van de data</typeparam>
         /// <param name="value">het object</param>
         /// <param name="defaultValue">de default-waarde</param>
         /// <returns></returns>
         public static T SafeConvert<T>(object value, T defaultValue)
         {
             if (value == null)
                 return defaultValue;
             return (T)Convert.ChangeType(value, typeof(T));
         }
}
comments powered by Disqus