We are working on a large legacy application and we\'re redesigning the business layer and the data layer. We believe that it is a good time to redesign the way cache is han
public T GetFromCache(string key, Func ifKeyNotFoundDelegate) to ensure that cache is always used the same. [1]Ah well, that covers most of what we do in our website (20GB memcached cluster spread over 20 servers).
[1] By making such a function the only interface to store stuff in cache, you can achieve the following. Let's say I want to use something from the cache, like the result from a function. Normally you would do something like
CacheManager cm = new CacheManager(CacheGroups.Totals);
object obj = cm.GetFromCache("function1result");
if(obj == null)
{
obj = (object)DAO.Foo();
cm.StoreInCache("function1result", obj);
}
return (List)obj;
By using a different interface you can ensure that users won't make a mistake here.
Like
public T GetFromCache(string key, Func ifnotfound)
{
T obj = this.GetFromCache(key) as T;
if(obj == default(T))
{
obj = ifnotfound.Invoke();
this.StoreInCache(key, obj);
}
return obj;
}
This ensures that
Ergo: less probable that they make a mistake. Furthermore: you get nicer, more clear, code, like:
List list = new CacheManager(CacheGroups.Total).GetFromCache>("function1result", ()=>DAO.Foo());