В ASP.NET 1.x мы можем использовать CacheDependency для реализации стратегий зависимости кэша, но поскольку этот класс запечатан, мы не можем наследовать этот класс для реализации наших собственных стратегий. Но с ASP.NET 2.0 мы уже можем получить из этого класса свои собственные классы зависимостей кэша.
Предположим, мы хотим разработать страницу и нам нужно получить самую свежую информацию о публикациях с главной страницы блога. Мы надеемся, что в целях повышения производительности данные страницы будут восстанавливаться только при обновлении домашней страницы блог-парка, в противном случае они будут получены непосредственно из кеша. Как достичь?
1. Спроектируйте класс BlogCacheDependency
и сначала проанализируйте его. Прежде всего, нет сомнений в том, что этот класс должен быть производным от CacheDependency, а затем его можно использовать в методе Insert Cache или в классе 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 общедоступных RSS XPathNavigator
9 {
10 получить
11 {
12 возврат _rss;
13}
14}
15
16 public BlogCacheDependency (строковая подача, int timeInterval)
17 {
18 _feed = корм;
19 _timeInterval = интервал времени;
20 _rss = ПолучитьRSS();
21 _tickTimer = новый таймер (новый TimerCallback (CheckDependencyCallback),
22 это, _timeInterval*1000, _timeInterval*1000);
двадцать три }
двадцать четыре
25 частных XPathNavigator GetRSS()
26 {
27 XPathDocument rssDoc = новый XPathDocument(_feed);
28 возврат rssDoc.CreateNavigator();
29 }
30
31 public void 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 защищенное переопределение void DependencyDispose()
42 {
43 _tickTimer = ноль;
44 base.DependencyDispose();
45 }
46}
47
48
Здесь конструктор BlogCacheDependency использует _tickTimer для реализации механизма регулярной проверки обновлений, который вызывает метод CheckDependencyCallback в соответствии с установленным интервалом времени.
Метод CheckDependencyCallback сравнивает две данные RSS. Если они различаются, вызывается метод NotifyDependencyChanged, чтобы уведомить базовый класс о том, что соответствующая зависимость кэша изменилась и данные в кэше должны быть очищены.
2. Дизайн страницы
Ниже приведен код страницы (в сокращении), который показывает, как использовать BlogCacheDependency:
1<script runat="server">
2 protected void Page_Load (отправитель объекта, EventArgs e)
3 {
4-строчный канал = " http://www.cnblogs.com/RSS.aspx ";
5, если (Кэш[канал] == ноль)
6 {
7 BlogCacheDependency bcd = новый BlogCacheDependency(feed, 600);
8 Cache.Insert(канал, 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</скрипт>
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</body>
29
В этом примере временной интервал, установленный для доступа к списку последних публикаций на главной странице блог-парка, составляет 600 секунд, то есть статус обновления проверяется каждые 10 минут.
Несколько моментов, на которые стоит обратить внимание:
1. Обратите внимание на используемый атрибут RssXml.XPathNavigator. Некоторые могут задаться вопросом, почему не используется RssXml.Document? Фактически, атрибут Document был упразднен в .NET 2.0. Рекомендуемой заменой является атрибут XPathNavigator. Как видно из предыдущего класса BlogCacheDependency, он создается из XPathDocument.CreateNavigator(). Из MSDN мы можем это знать. Класс XPathDocument предоставляет быстрый кэш только для чтения, который, очевидно, больше подходит для этого примера.
2. Задумайтесь, какова цель метода DependencyDispose в классе BlogCacheDependency? Чем он отличается от метода Dispose? Давайте задумаемся. Если при проверке обновлений было обнаружено изменение зависимости, но запрос не был отправлен повторно, будет ли метод CheckDependencyCallback выполняться непрерывно через определенные промежутки времени? Если это действительно так, не будет ли это совершенно избыточным, ведь пока изменение обнаружено один раз, нет необходимости проверять его снова. И если мы отслеживаем или записываем логи, то можем обнаружить, что на самом деле, пока будут обнаружены изменения зависимостей, они не будут проверяться повторно. В чем секрет? Если вы подумаете об этом, вы поймете, что метод NotifyDependencyChanged таит в себе много загадок, и причина, по которой существует метод DependencyDispose, на самом деле здесь. Дизайнерские идеи в нем достойны внимания.
3. Не буду больше говорить об используемом на странице Translate.xsl
, но вот основные коды:
1<xsl:template match="channel">
2 <дел>
3 <xsl:for-each select="item">
4 <а>
5 <xsl:attribute name="href">
6 <xsl:value-of select="link"/>
7 </xsl:attribute>
8 <xsl:value-of select="title"/>
9 </а>
10 <br />
11 </xsl:for-each>
12 </div>
13</xsl:template>
4. Выполнение.
Это снимок экрана первоначального выполнения:
Когда на главной странице блог-сада не появляются новые сообщения, мы обновляем страницу и всегда получаем следующую страницу:
Как только появится новое сообщение, при обновлении появится предыдущее изображение.
5. Хотите ли вы стать более продвинутым?
Если вы такие же ленивые, как я, или ленивее меня, то вы можете рассмотреть возможность использования JavaScript для написания небольшой функции, которая автоматически обновляет страницу, а затем украшает ее, или упаковать ее в компонент многократного использования для использования на своем веб-сайте. Или вы просто хотите создать на этой машине что-то вроде «коллекции контента, которая меня больше всего волнует»? Что ж, думаю, эффект будет весьма неплохой.