ASP.NET 1.x では、CacheDependency を使用してキャッシュ依存関係戦略を実装できますが、このクラスはシールされているため、このクラスを継承して独自の戦略を実装することはできません。しかし、ASP.NET 2.0 では、このクラスから独自のキャッシュ依存関係クラスをすでに派生できます。
ページをデザインし、ブログのトップページから最新の投稿情報を取得する必要があるとします。パフォーマンスを向上させるために、ページ データはブログ パークのホームページが更新されたときにのみ再生成され、それ以外の場合はキャッシュから直接取得されるようにしたいと考えています。どうやって達成するのか?
1. BlogCacheDependency クラスを設計し
て分析します。まず、このクラスが CacheDependency から派生する必要があることは間違いありません。その後、Cache の Insert メソッドで使用することも、AggregateDependency クラスで使用することもできます。
2つ目は、ブログパークが提供するRSSとページデザインの観点から、RSSデータをキャッシュに置き、表示時にスタイル変換を利用できることです。依存関係を確認する場合は、現在の RSS が Web サイトの RSS と同じかどうかを単純に比較するだけで済みます。
さらに重要な問題は、RSS データをいつチェックして比較するのかということです。リクエストごとに?明らかにそうではありません。これはキャッシュを使用しないのとほぼ同じであり、実際には不要な負担がかかります。リクエストなしでチェックインするのはどうですか?タイマーを使用して制御し、更新があるかどうかを定期的にチェックさせ、更新がある場合は変更の依存関係を通知します。
CacheDependency クラスに HasChanged プロパティがあることはわかっていますが、BlogCacheDependency は依存関係の変更を検出したときにその基本クラスにどのように通知するのでしょうか?これは、ASP.NET 2.0 の CacheDependency クラスの新しい NotifyDependencyChanged メソッドの役割です。
また、再利用を容易にするために、BlogCacheDependency クラスには取得したい RSS データの URL を保存するフィード データが必要です。使用中にリフレッシュ速度を調整しやすくするための時間間隔もあります。
OK、実際の実装コードを見てみましょう:
1public class BlogCacheDependency : CacheDependency
2{
3 プライベートタイマー _tickTimer;
4 private int _timeInterval;
5 プライベート XPathNavigator _rss;
6 プライベート文字列 _feed;
7
8 パブリック XPathNavigator RSS
9 {
10ゲット
11 {
12 _rss を返す;
13}
14}
15
16 public BlogCacheDependency(文字列フィード、int timeInterval)
17 {
18 _feed = フィード;
19 _時間間隔 = 時間間隔;
20 _rss = GetRSS();
21 _tickTimer = 新しいタイマー(新しいタイマーコールバック(CheckDependencyCallback),
22 これ、_timeInterval * 1000、_timeInterval * 1000);
23 }
24
25 プライベート XPathNavigator GetRSS()
26 {
27 XPathDocument rssDoc = 新しい XPathDocument(_feed);
28 return rssDoc.CreateNavigator();
29 }
30
31 public void CheckDependencyCallback(オブジェクト送信者)
32 {
33 BlogCacheDependency bcd = BlogCacheDependency としての送信者。
34 XPathNavigator newRSS = GetRSS();
35 if (newRSS.OuterXml != _rss.OuterXml)
36 {
37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
38 }
39 }
40
41 保護されたオーバーライド void dependencyDispose()
42 {
43 _tickTimer = null;
44 基本.DependencyDispose();
45 }
46}
47
48
ここで、BlogCacheDependency のコンストラクターは _tickTimer を使用して更新を定期的にチェックするメカニズムを実装し、設定された時間間隔に従って CheckDependencyCallback メソッドを呼び出します。
CheckDependencyCallback メソッドは 2 つの RSS 情報を比較し、異なる場合は NotifyDependencyChanged メソッドが呼び出され、対応するキャッシュの依存関係が変更されたため、キャッシュ内のデータをクリアする必要があることが基本クラスに通知されます。
2. ページのデザイン
以下は、BlogCacheDependency の使用方法を示すページ コード (抜粋) です。
1<script runat="server">
2 protected void Page_Load(オブジェクト送信者, EventArgs e)
3 {
4 文字列フィード = " http://www.cnblogs.com/RSS.aspx ";
5 if (キャッシュ[フィード] == null)
6 {
7 BlogCacheDependency bcd = 新しい BlogCacheDependency(feed, 600);
8 キャッシュ.挿入(フィード, bcd.RSS, bcd);
9 Label1.Text = "現在のデータが取得され、キャッシュに更新されました!";
10}
その他11
12 {
13 Label1.Text = "現在のデータはキャッシュから取得されます!";
14}
15 RssXml.XPathNavigator = System.Xml.XPath.XPathNavigator としてキャッシュ[フィード];
16 RssXml.TransformSource = "translate.xsl";
17}
18</script>
19
20<本体>
21 <form id="form1" runat="server">
22 ブログパークの最新投稿:
23<br />
24 <asp:Xml ID="RssXml" runat="サーバー" />
25<br />
26 <asp:Label ID="Label1" runat="server" ForeColor="red" />
27 </form>
28</body>
29
この例では、ブログパークのホームページの最新記事一覧へのアクセス間隔は600秒、つまり10分ごとに更新状況を確認するように設定されています。
注意すべき点は次のとおりです。
1. 使用されている RssXml.XPathNavigator 属性に注意してください。なぜ RssXml.Document が使用されないのか疑問に思う人もいるかもしれません。実際、Document 属性は .NET 2.0 で廃止されました。代わりに推奨されるのは XPathNavigator 属性です。前の BlogCacheDependency クラスからわかるように、MSDN からは次のことがわかります。 XPathDocument クラスは読み取り専用の高速キャッシュを提供します。これは明らかにこの例により適しています。
2. 考えてみてください。BlogCacheDependency クラスの dependencyDispose メソッドの目的は何でしょうか。 Dispose メソッドとの違いは何ですか?考えてみましょう。更新のチェック中に依存関係の変更が検出されたが、リクエストが再度送信されなかった場合、CheckDependencyCallback メソッドは一定の間隔で継続的に実行されるでしょうか。これが実際に当てはまる場合、変更が一度検出される限り、再度確認する必要がないため、完全に冗長ではないでしょうか。そして、ログを追跡または記録すると、実際には、依存関係の変更が見つかった限り、それらは再度チェックされないことがわかります。秘密は何ですか?考えてみると、NotifyDependencyChanged メソッドには謎が多く、DependencyDispose メソッドが存在する理由は実はここにあります。そこに込められたデザインアイデアは味わう価値があります。
3. このページで使用されているtranslate.xslについてはこれ以上は述べません
が、主なコードは次のとおりです:
1<xsl:template match="channel">
2 <div>
3 <xsl:for-each select="item">
4 <a>
5 <xsl:属性名="href">
6 <xsl:value-of select="link"/>
7 </xsl:属性>
8 <xsl:value-of select="title"/>
9</a>
10<br />
11 </xsl:for-each>
12 </div>
13</xsl:template>
4. 実行:
これは、最初の実行のスクリーンショットです。
ブログ ガーデンのトップページに新しい投稿が表示されない場合、ページが更新され、常に次のページが表示されます。
新しい投稿があると更新すると前の画像が表示されます。
5. さらに上級になりたいですか?
あなたが私と同じくらい怠け者、または私よりも怠け者である場合は、JavaScript を使用してページを自動的に更新する小さな関数を作成し、ページを装飾するか、Web サイトで使用するために再利用可能なコンポーネントにパッケージ化することを検討できます。このマシンで「最も気になるコンテンツ コレクション」のようなものを作成したいだけですか?まあ、効果はかなりあると思います。