ASP.NET Custom Method Cache
This is an experiment to caché results from static classes in an ASP.NET MVC project.
Domain services (see DDD) are static classes for this project :(.
Caché usage is as following:
The MethodCache.Get uses the calling method name as caché Key (in the previous code fragment TiposMoneda), so you don’t need to specify a caché key if you don’t want to.
Here is my implementation:
Code Snippet
public static class MethodCache
{
[MethodImpl(MethodImplOptions.NoInlining)]
public static TResult Get<TResult>(Func<TResult> action)
where TResult : class
{
string cacheKey = null;
object cacheValue = null;
var callingFrame = new StackTrace().GetFrames().Skip(1).FirstOrDefault();
if (callingFrame != null)
{
cacheKey = callingFrame.GetMethod().DeclaringType.FullName + callingFrame.GetMethod().Name;
}
if (cacheKey != null)
{
cacheValue = System.Web.HttpContext.Current.Cache[cacheKey];
}
if (cacheValue == null || cacheValue.GetType() != typeof(TResult))
{
cacheValue = action();
System.Web.HttpContext.Current.Cache[cacheKey] = cacheValue;
}
return (TResult)cacheValue;
}
}
{
[MethodImpl(MethodImplOptions.NoInlining)]
public static TResult Get<TResult>(Func<TResult> action)
where TResult : class
{
string cacheKey = null;
object cacheValue = null;
var callingFrame = new StackTrace().GetFrames().Skip(1).FirstOrDefault();
if (callingFrame != null)
{
cacheKey = callingFrame.GetMethod().DeclaringType.FullName + callingFrame.GetMethod().Name;
}
if (cacheKey != null)
{
cacheValue = System.Web.HttpContext.Current.Cache[cacheKey];
}
if (cacheValue == null || cacheValue.GetType() != typeof(TResult))
{
cacheValue = action();
System.Web.HttpContext.Current.Cache[cacheKey] = cacheValue;
}
return (TResult)cacheValue;
}
}
Note the NoInlining method option. This is a very important flag to the CLR. We don’t want to inline the method as it would interfere with the StackTrace (thus with the evaluation of the caché key).