当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

ASP.NET 2.0 中使用自定义缓存依赖

欢迎进入.NET社区论坛,与200万技术人员互动交流 >>进入

    在 ASP.NET 1.x 中,我们可以使用 CacheDependency 来实现缓存依赖策略,但由于这个类是 sealed 的,我们无法继承这个类来实现我们自己的策略。但是到了 ASP.NET 2.0,我们已经可以从这个类派生出自己的缓存依赖类了。
  
  假定我们要设计一个页面,需要从博客园首页获取最新的贴子信息。为了提高性能,我们希望页面数据仅当博客园首页有更新时才重新生成,否则的话就直接从缓存中获取。如何实现?
  
  一、设计 BlogCacheDependency 类
  
  先分析一下,首先,毫无疑问的,这个类应当从 CacheDependency 派生出来,然后它才能在 Cache 的 Insert 方法中使用,或者被用在 AggregateDependency 类中。
  
  其次,从博客园提供的 RSS 以及页面设计的角度考虑,可以在缓存中放置 RSS 数据,显示的时候使用一个样式转换。而在检查依赖性的时候,我们只需要简单地比较一下当前的 RSS 与网站的 RSS 是否相同就可以了。
  
  一个比较重要的问题是:我们何时去检查比较 RSS 数据?在每次请求的时候吗?显然不行,这样一来跟不使用缓存几乎没什么区别,甚至实际上加重了无谓的负担。考虑在没有请求的时候进行检查呢?我们可以使用一个 Timer 来控制,让它定期去检查一个是否有更新,如果有更新则通知依赖发生了改变。
  
  我们知道 CacheDependency 类有一个 HasChanged 属性,但是当 BlogCacheDependency 检查到依赖改变时如何告诉它的基类呢?这就是在 ASP.NET 2.0 中 CacheDependency 类中新增的 NotifyDependencyChanged 方法的使命了。
  
  此外为了便于重用,BlogCacheDependency 类须得有一个 feed 数据,用来保存我们要获取的 RSS 数据的 URL。还要有一个时间间隔,便于在使用的时候调整刷新速度。
  
  好,看看实际的实现代码:
  
   1public class BlogCacheDependency : CacheDependency
   2{
   3 private Timer _tickTimer;
   4 private int _timeInterval;
   5 private XPathNavigator _rss;
   6 private string _feed;
   7
   8 public XPathNavigator RSS
   9 {
  10 get
  11 {
  12 return _rss;
  13 }
  14 }
  15
  16 public BlogCacheDependency(string feed, int timeInterval)
  17 {
  18 _feed = feed;
  19 _timeInterval = timeInterval;
  20 _rss = GetRSS();
  21 _tickTimer = new Timer(new TimerCallback(CheckDependencyCallback),
  22 this, _timeInterval * 1000, _timeInterval * 1000);
  23 }
  24
  25 private XPathNavigator GetRSS()
  26 {
  27 XPathDocument rssDoc = new XPathDocument(_feed);
  28 return rssDoc.CreateNavigator();
  29 }
  30
  31 public void CheckDependencyCallback(object sender)
  32 {
  33 BlogCacheDependency bcd = sender as BlogCacheDependency;
  34 XPathNavigator newRSS = GetRSS();
  35 if (newRSS.OuterXml != _rss.OuterXml)
  36 {
  37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
  38 }
  39 }
  40
  41 protected override void DependencyDispose()
  42 {
  43 _tickTimer = null;
  44 base.DependencyDispose();
  45 }
  46}
  47
  48
  这里,BlogCacheDependency 的构造函数中使用 _tickTimer 实现了一个定时检查更新的机制,它根据设定的时间间隔去调用 CheckDependencyCallback 方法。
  
  而 CheckDependencyCallback 方法则将两个 RSS 信息进行比较,如果不同,则调用 NotifyDependencyChanged 方法通知基类,相应的缓存依赖已经发生了变化,缓存中的数据应当被清除。
  

相关内容
赞助商链接