I had to cache common database data like data that were displayed in drop downs. I used MemoryCache
. And I used Entity Framework code first
and Autofac
for dependency injection.
Here is part of what I did in my solution, might not work for you but it worked for me, not perfect though but needs a lot of cleaning up to do.
My ICacheManager
interface:
public interface ICacheManager
{
T Get<T>(string key);
void Set(string key, object data, int cacheTime);
bool IsSet(string key);
void Remove(string key);
void Clear();
}
My CacheManager
class:
public class CacheManager : ICacheManager
{
private ObjectCache Cache
{
get
{
return MemoryCache.Default;
}
}
public T Get<T>(string key)
{
return (T)Cache[key];
}
public void Set(string key, object data, int cacheTime)
{
if (data == null)
{
return;
}
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Add(new CacheItem(key, data), policy);
}
public bool IsSet(string key)
{
return (Cache.Contains(key));
}
public void Remove(string key)
{
Cache.Remove(key);
}
public void Clear()
{
foreach (var item in Cache)
{
Remove(item.Key);
}
}
}
An extension class for my caching:
public static class CacheExtensions
{
public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
{
return Get(cacheManager, key, 60, acquire);
}
public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)
{
if (cacheManager.IsSet(key))
{
return cacheManager.Get<T>(key);
}
else
{
var result = acquire();
cacheManager.Set(key, result, cacheTime);
return result;
}
}
}
And this is how I would use it in my repository class. This method returns a list of all my banks which is displayed in a drop down.
public class BankRepository : RepositoryBase<Bank>, IBankRepository
{
private readonly ICacheManager cacheManager;
private const string BanksAllCacheKey = "banks-all";
public BankRepository(IDatabaseFactory databaseFactory, ICacheManager cacheManager)
: base(databaseFactory)
{
Check.Argument.IsNotNull(cacheManager, "cacheManager");
this.cacheManager = cacheManager;
}
public IEnumerable<Bank> FindAll()
{
string key = string.Format(BanksAllCacheKey);
return cacheManager.Get(key, () =>
{
var query = from bank in DatabaseContext.Banks
orderby bank.Name
select bank;
return query.ToList();
});
}
}
I hope this helps. It's a very simple implementation but it works for me. There are many articles online on how to use a caching strategy in ASP.NET MVC
. Just Google
it.