في ASP.NET 1.x، يمكننا استخدام CacheDependency لتنفيذ استراتيجيات تبعية ذاكرة التخزين المؤقت، ولكن بما أن هذه الفئة مغلقة، فلا يمكننا أن نرث هذه الفئة لتنفيذ استراتيجياتنا الخاصة. ولكن مع ASP.NET 2.0، يمكننا بالفعل استخلاص فئات تبعية ذاكرة التخزين المؤقت الخاصة بنا من هذه الفئة.
لنفترض أننا نريد تصميم صفحة ونحتاج إلى الحصول على أحدث معلومات المنشور من الصفحة الرئيسية للمدونة. من أجل تحسين الأداء، نأمل ألا يتم إعادة إنشاء بيانات الصفحة إلا عند تحديث الصفحة الرئيسية لمتنزه المدونات، وإلا فسيتم الحصول عليها مباشرة من ذاكرة التخزين المؤقت. كيفية تحقيق؟
1. قم بتصميم فئة BlogCacheDependency
وقم بتحليلها أولاً، لا شك أن هذه الفئة يجب أن تكون مشتقة من CacheDependency، ومن ثم يمكن استخدامها في طريقة Insert الخاصة بذاكرة التخزين المؤقت، أو استخدامها في فئة AggregateDependency.
ثانيًا، من منظور RSS الذي يوفره Blog Park وتصميم الصفحة، يمكنك وضع بيانات RSS في ذاكرة التخزين المؤقت واستخدام تحويل النمط عند عرضها. عند التحقق من التبعيات، نحتاج فقط إلى مقارنة ما إذا كان RSS الحالي هو نفس RSS الخاص بموقع الويب.
والسؤال الأهم هو: متى نتحقق من بيانات RSS ونقارنها؟ في كل طلب؟ من الواضح أن هذا لا يشبه عدم استخدام ذاكرة التخزين المؤقت، وهو في الواقع يضيف عبئًا غير ضروري. ماذا عن تسجيل الدخول دون طلب؟ يمكننا استخدام مؤقت للتحكم فيه والسماح له بالتحقق مما إذا كان هناك تحديث بانتظام. إذا كان هناك تحديث، فسوف يقوم بإعلام تبعية التغيير.
نحن نعلم أن فئة CacheDependency لها خاصية HasChanged، ولكن كيف تخبر BlogCacheDependency فئتها الأساسية عندما تكتشف تغيير التبعية؟ هذه هي مهمة أسلوب NotifyDependencyChanged الجديد في فئة CacheDependency في ASP.NET 2.0.
بالإضافة إلى ذلك، لتسهيل إعادة الاستخدام، يجب أن تحتوي فئة BlogCacheDependency على بيانات موجزة لحفظ عنوان URL لبيانات RSS التي نريد الحصول عليها. يوجد أيضًا فاصل زمني لتسهيل ضبط سرعة التحديث أثناء الاستخدام.
حسنًا، دعونا نلقي نظرة على كود التنفيذ الفعلي:
1public class BlogCacheDependency : CacheDependency
2 {
3 مؤقت خاص _tickTimer؛
4 خاص int _timeInterval؛
5 خاص XPathNavigator _rss;
6 سلسلة خاصة _feed؛
7
8. XPathNavigator RSS العامة
9 {
10 الحصول على
11 {
12 عودة _rss;
13}
14}
15
16. BlogCacheDependency العامة (خلاصة السلسلة، int timeInterval)
17 {
18 _تغذية = تغذية؛
19 _timeInterval = timeInterval;
20 _rss = GetRSS();
21 _tickTimer = new Timer(new TimerCallback(CheckDependencyCallback),
22 هذا، _timeInterval * 1000، _timeInterval * 1000)؛
ثلاثة وعشرين }
أربعة وعشرون
25 برنامج XPathNavigator GetRSS () الخاص
26 {
27 XPathDocument rssDoc = new XPathDocument(_feed);
28 إرجاع rssDoc.CreateNavigator();
29 }
30
31 CheckDependencyCallback الفراغ العام (مرسل الكائن)
32 {
33 BlogCacheDependency bcd = المرسل باسم BlogCacheDependency؛
34 XPathNavigator newRSS = GetRSS();
35 إذا (newRSS.OuterXml != _rss.OuterXml)
36 {
37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
38 }
39 }
40
41 تجاوز محمي باطلة DependencyDispose()
42 {
43 _tickTimer = null;
44 base.DependencyDispose();
45 }
46}
47
48
هنا، يستخدم مُنشئ BlogCacheDependency _tickTimer لتنفيذ آلية للتحقق من التحديثات بانتظام، والتي تستدعي طريقة CheckDependencyCallback وفقًا للفاصل الزمني المحدد.
يقارن أسلوب CheckDependencyCallback بين معلومات RSS. إذا كانت مختلفة، يتم استدعاء أسلوب NotifyDependencyChanged لإعلام الفئة الأساسية بأن تبعية ذاكرة التخزين المؤقت المقابلة قد تغيرت ويجب مسح البيانات الموجودة في ذاكرة التخزين المؤقت.
2. تصميم الصفحة
فيما يلي رمز الصفحة (المختصر)، الذي يوضح كيفية استخدام BlogCacheDependency:
1<script runat="server">
2 Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
3 {
4 سلسلة تغذية = " http://www.cnblogs.com/RSS.aspx "؛
5 إذا (ذاكرة التخزين المؤقت [الخلاصة] == فارغة)
6 {
7 BlogCacheDependency bcd = new BlogCacheDependency(feed, 600);
8 Cache.Insert(feed, bcd.RSS, bcd);
9 Label1.Text = "تم الحصول على البيانات الحالية للتو وتم تحديثها إلى ذاكرة التخزين المؤقت!";
10}
11 آخر
12 {
13 Label1.Text = "يتم الحصول على البيانات الحالية من ذاكرة التخزين المؤقت!";
14}
15 RssXml.XPathNavigator = Cache[feed] as 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="server" />
25<br />
26 <asp:Label ID = "Label1" runat = "server" ForeColor = "red" />
27 </النموذج>
28</الجسم>
29
في هذا المثال، الفاصل الزمني المحدد للوصول إلى قائمة أحدث المنشورات على الصفحة الرئيسية لمتنزه المدونة هو 600 ثانية، أي أنه يتم التحقق من حالة التحديث كل 10 دقائق.
عدة نقاط جديرة بالملاحظة:
1. انتبه إلى خاصية RssXml.XPathNavigator المستخدمة. قد يتساءل بعض الأشخاص عن سبب عدم استخدام RssXml.Document؟ في الواقع، تم إلغاء سمة المستند في .NET 2.0. والاستبدال الموصى به هو سمة XPathNavigator، كما ترى من فئة BlogCacheDependency السابقة، فقد تم إنشاؤها من XPathDocument.CreateNavigator(). توفر فئة XPathDocument ذاكرة تخزين مؤقت سريعة للقراءة فقط، ومن الواضح أنها أكثر ملاءمة لهذا المثال.
2. فكر في الأمر، ما هو الغرض من طريقة DependencyDispose في فئة BlogCacheDependency؟ وكيف تختلف عن طريقة التخلص؟ دعونا نفكر في الأمر، إذا تم العثور على تغيير في التبعية عند التحقق من التحديثات، ولكن لم يتم إرسال الطلب مرة أخرى، فهل سيتم تنفيذ طريقة CheckDependencyCallback بشكل مستمر على فترات؟ إذا كان هذا هو الحال حقًا، ألن يكون ذلك زائدًا عن الحاجة تمامًا، لأنه طالما تم اكتشاف التغيير مرة واحدة، ليست هناك حاجة للتحقق مرة أخرى. وإذا قمنا بتتبع السجلات أو تسجيلها، فيمكننا أن نجد أنه في الواقع، طالما تم العثور على تغييرات التبعية، فلن يتم التحقق منها مرة أخرى. ما هو السر؟ إذا فكرت في الأمر، ستعرف أن طريقة NotifyDependencyChanged بها الكثير من الغموض، والسبب وراء وجود طريقة DependencyDispose موجود بالفعل هنا. أفكار التصميم فيه تستحق التذوق.
3. لن أتحدث أكثر عن ملف Translation.xsl المستخدم في الصفحة
، ولكن إليك الرموز الرئيسية:
1<xsl:template match="channel">
2 <ديف>
3 <xsl:for-each حدد = "item">
4 <أ>
5 <xsl:اسم السمة = "href">
6 <xsl:قيمة التحديد='link'/>
7 </xsl:السمة>
8 <xsl:قيمة التحديد='العنوان'/>
9 </أ>
10<br />
11 </xsl:لكل>
12 </د>
13</xsl:قالب>
4. التنفيذ:
هذه لقطة شاشة للتنفيذ الأولي:
عند عدم ظهور أي منشورات جديدة على الصفحة الرئيسية لحديقة المدونات، نقوم بتحديث الصفحة ونحصل دائمًا على الصفحة التالية:
بمجرد وجود مشاركة جديدة، ستظهر الصورة السابقة عند التحديث.
5. هل تريد أن تكون أكثر تقدماً؟
إذا كنت كسولًا مثلي أو أكثر كسولًا مني، فيمكنك التفكير في استخدام جافا سكريبت لكتابة وظيفة صغيرة تعمل على تحديث الصفحة تلقائيًا، ثم تزيين الصفحة، أو تجميعها في مكون قابل لإعادة الاستخدام لاستخدامه على موقع الويب الخاص بك أو هل أنت كذلك؟ هل تريد فقط إنشاء شيء مثل "مجموعة المحتوى التي أهتم بها كثيرًا" في هذا الجهاز؟ حسنًا، أعتقد أن التأثير سيكون جيدًا جدًا.