Di ASP.NET 1.x, kita dapat menggunakan CacheDependency untuk mengimplementasikan strategi ketergantungan cache, namun karena kelas ini disegel, kita tidak dapat mewarisi kelas ini untuk mengimplementasikan strategi kita sendiri. Tapi dengan ASP.NET 2.0, kita sudah bisa mendapatkan kelas ketergantungan cache kita sendiri dari kelas ini.
Misalkan kita ingin mendesain sebuah halaman dan perlu mendapatkan informasi postingan terbaru dari beranda blog. Untuk meningkatkan kinerja, kami berharap data halaman hanya akan dibuat ulang ketika halaman beranda taman blog diperbarui, jika tidak maka akan diperoleh langsung dari cache. Bagaimana cara mencapainya?
1. Rancang kelas BlogCacheDependency
dan analisis terlebih dahulu. Pertama-tama, tidak ada keraguan bahwa kelas ini harus diturunkan dari CacheDependency, dan kemudian dapat digunakan dalam metode Sisipkan Cache, atau digunakan dalam kelas AggregateDependency.
Kedua, dari perspektif RSS yang disediakan oleh Blog Park dan desain halaman, Anda dapat menempatkan data RSS di cache dan menggunakan konversi gaya saat menampilkannya. Saat memeriksa dependensi, kita hanya perlu membandingkan apakah RSS saat ini sama dengan RSS website.
Pertanyaan yang lebih penting adalah: kapan kita memeriksa dan membandingkan data RSS? Pada setiap permintaan? Jelas tidak. Ini hampir sama dengan tidak menggunakan cache, dan justru menambah beban yang tidak perlu. Bagaimana dengan check-in tanpa permintaan? Kita dapat menggunakan Timer untuk mengontrolnya dan membiarkannya memeriksa apakah ada pembaruan secara berkala. Jika ada pembaruan, itu akan memberitahukan ketergantungan perubahan tersebut.
Kita tahu bahwa kelas CacheDependency memiliki properti HasChanged, tapi bagaimana BlogCacheDependency memberitahu kelas dasarnya ketika mendeteksi perubahan ketergantungan? Ini adalah misi metode NotifyDependencyChanged baru di kelas CacheDependency di ASP.NET 2.0.
Selain itu, untuk memudahkan penggunaan kembali, kelas BlogCacheDependency harus memiliki data feed untuk menyimpan URL data RSS yang ingin kita peroleh. Terdapat juga interval waktu untuk memudahkan pengaturan kecepatan refresh saat digunakan.
Oke, mari kita lihat kode implementasi sebenarnya:
1public class BlogCacheDependency : CacheDependency
2{
3 Timer pribadi _tickTimer;
4 int pribadi _timeInterval;
5 XPathNavigator pribadi _rss;
6 string pribadi _feed;
7
8 RSS XPathNavigator publik
9 {
10 dapatkan
11 {
12 kembalikan _rss;
13}
14}
15
16 Ketergantungan BlogCache publik (umpan string, int Interval waktu)
17 {
18 _umpan = umpan;
19 _timeInterval = interval waktu;
20 _rss = DapatkanRSS();
21 _tickTimer = Timer baru(TimerCallback baru(CheckDependencyCallback),
22 ini, _timeInterval * 1000, _timeInterval * 1000);
dua puluh tiga }
dua puluh empat
25 XPathNavigator GetRSS() pribadi
26 {
27 XPathDocument rssDoc = XPathDocument baru(_feed);
28 kembalikan rssDoc.CreateNavigator();
29 }
30
31 public void CheckDependencyCallback (pengirim objek)
32 {
33 BlogCacheDependency bcd = pengirim sebagai BlogCacheDependency;
34 XPathNavigator newRSS = GetRSS();
35 jika (RSS.OuterXml baru!= _rss.OuterXml)
36 {
37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
38 }
39 }
40
41 penggantian yang dilindungi void DependencyDispose()
42 {
43 _tickTimer = nol;
44 basis.DependencyDispose();
45 }
46}
47
48
Di sini, konstruktor BlogCacheDependency menggunakan _tickTimer untuk mengimplementasikan mekanisme pemeriksaan pembaruan rutin, yang memanggil metode CheckDependencyCallback sesuai dengan interval waktu yang ditentukan.
Metode CheckDependencyCallback membandingkan dua informasi RSS. Jika keduanya berbeda, metode NotifyDependencyChanged dipanggil untuk memberi tahu kelas dasar bahwa ketergantungan cache terkait telah berubah dan data dalam cache harus dihapus.
2. Desain halaman
Berikut ini adalah kode halaman (ringkasan) yang menunjukkan cara menggunakan BlogCacheDependency:
1<script runat="server">
2 void Page_Load yang dilindungi (pengirim objek, EventArgs e)
3 {
4 string umpan = " http://www.cnblogs.com/RSS.aspx ";
5 jika (Cache[umpan] == null)
6 {
7 BlogCacheDependency bcd = BlogCacheDependency baru(umpan, 600);
8 Cache.Sisipkan(umpan, bcd.RSS, bcd);
9 Label1.Text = "Data terkini baru saja diperoleh dan telah diupdate ke dalam cache!";
10}
11 lainnya
12 {
13 Label1.Text = "Data terkini diperoleh dari cache!";
14}
15 RssXml.XPathNavigator = Cache[umpan] sebagai System.Xml.XPath.XPathNavigator;
16 RssXml.TransformSource = "translate.xsl";
17}
18</skrip>
19
20<tubuh>
21 <form id="form1" runat="server">
22 postingan terbaru Taman Blog:
23 <br />
24 <asp:Xml ID="RssXml" runat="server" />
25 <br />
26 <asp:Label ID="Label1" runat="server" ForeColor="merah" />
27 </bentuk>
28</tubuh>
29
Pada contoh ini, interval waktu yang ditetapkan untuk mengakses daftar postingan terbaru di beranda taman blog adalah 600 detik, artinya status update diperiksa setiap 10 menit.
Beberapa hal yang perlu diperhatikan:
1. Perhatikan atribut RssXml.XPathNavigator yang digunakan. Faktanya, atribut Dokumen telah dihapuskan di .NET 2.0. Pengganti yang disarankan adalah atribut XPathNavigator. Seperti yang Anda lihat dari kelas BlogCacheDependency sebelumnya, atribut ini dibuat dari XPathDocument.CreateNavigator(). Kelas XPathDocument menyediakan cache cepat read-only, yang jelas lebih cocok untuk contoh ini.
2. Coba pikirkan, apa tujuan dari metode DependencyDispose di kelas BlogCacheDependency? Apa bedanya dengan metode Buang? Mari kita pikirkan. Jika perubahan ketergantungan ditemukan saat memeriksa pembaruan, tetapi permintaan belum dikirim lagi, apakah metode CheckDependencyCallback akan dieksekusi terus menerus pada interval waktu tertentu? Jika memang demikian, bukankah itu mubazir sepenuhnya, karena selama perubahan terdeteksi satu kali, tidak perlu dilakukan pengecekan lagi. Dan jika kita melacak atau mencatat log, kita dapat menemukan bahwa sebenarnya selama perubahan ketergantungan ditemukan, perubahan tersebut tidak akan diperiksa lagi. Apa rahasianya? Jika dipikir-pikir, Anda akan tahu bahwa metode NotifyDependencyChanged memiliki banyak misteri, dan alasan mengapa ada metode DependencyDispose sebenarnya ada di sini. Ide desain di dalamnya layak untuk dinikmati.
3. Saya tidak akan mengatakan lebih banyak tentang terjemahan.xsl yang digunakan pada halaman tersebut
, tetapi berikut adalah kode utamanya:
1<xsl:template match="channel">
2 <div>
3 <xsl:untuk setiap pilih="item">
4 <a>
5 <xsl:nama atribut="href">
6 <xsl:nilai-dari pilih="tautan"/>
7 </xsl:atribut>
8 <xsl:nilai-dari pilih="judul"/>
9 </a>
10 <br />
11 </xsl:untuk setiap>
12 </div>
13</xsl:templat>
4. Eksekusi:
Ini adalah screenshot eksekusi awal:
Ketika tidak ada postingan baru yang muncul di beranda taman blog, kita me-refresh halaman tersebut dan selalu mendapatkan halaman berikut:
Begitu ada postingan baru, gambar sebelumnya akan muncul saat di-refresh.
5. Apakah Anda ingin lebih maju?
Jika Anda sama malasnya dengan saya atau lebih malas dari saya, maka Anda dapat mempertimbangkan untuk menggunakan javascript untuk menulis fungsi kecil yang secara otomatis menyegarkan halaman, lalu menghiasi halaman tersebut, atau mengemasnya menjadi komponen yang dapat digunakan kembali untuk digunakan di situs web Anda. Atau apakah Anda hanya ingin membuat sesuatu seperti "kumpulan konten yang paling saya pedulikan" di mesin ini? Menurut saya, efeknya akan cukup bagus.