在asp.net mvc2中使用企业库缓存应用程序块

时间:2011-04-06 04:52:21

标签: asp.net-mvc-2 enterprise-library

我尝试使用微软企业库的缓存应用程序块。我使用过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的回复。在代码的实现中是否有任何错误,或者是否有详细的缓存背后的理论。

请建议此用法的最佳做法。

1 个答案:

答案 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];
    }
}