我尝试使用微软企业库的缓存应用程序块。我使用过MS Enterprise Library V5.0
以下是我在家庭控制器索引方法中所做的示例代码。
Person p = new Person(10, "person1");
ICacheManager cacheMgr = CacheFactory.GetCacheManager("myCache");
ViewData["Message"] = "Welcome to ASP.NET MVC!";
if (Session["currsession"] != null)
{
if (!cacheMgr.Contains(p.pid.ToString()))
{
Response.Write("item is not in cache");
return View(p);
}
else
{
Response.Write("item is still in cache");
return View(p);
}
}
else
{
Session["currsession"] = 1;
cacheMgr.Add(p.pid.ToString(), p, CacheItemPriority.High, null, new SlidingTime(TimeSpan.FromSeconds(10)));
return View(cacheMgr.GetData(p.pid.ToString()));
}
我在模型中使用的person类只有一个带有2个公共属性的构造函数。没有使用任何特殊功能。
现在,这是使用企业库缓存块缓存的正确过程。如果没有,我怎么能以有效的方式编码这段代码。
此外,我只在延迟20秒后得到item is not in cache
的回复。在代码的实现中是否有任何错误,或者是否有详细的缓存背后的理论。
请建议此用法的最佳做法。
答案 0 :(得分:0)
由于您指定的滑动过期时间为10秒,这意味着如果您在重新加载页面之间等待超过10秒,则会获得item is not in cache
。
在会话中加载第一次=>没有消息
重新加载=>在缓存中
重新加载=>在缓存中
等待10秒钟
重新加载=>不在缓存中
这就是你所看到的吗?
旧答案:
企业缓存应用程序块可能比您需要的更多。我最喜欢的缓存是FubuMVC的缓存(只包括FubuCore.dll)。通过使用带有“缺少元素”委托的ConcurrentDictionary,您可以获得非常类似的实现。这是一个例子:http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/37bbc361-6851-43db-9e90-80cc7e6ac15f
FubuMVC Cache示例:
public class PersonCache
{
private Cache _Cache = new Cache();
public PersonCache()
{
_Cache.OnMissing = key => MyDatabase.People.GetById(key);
}
public Person GetById(int id)
{
return _Cache[id];
}
}