在 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;
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器