日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net PetShop 4.0的缓存处理

發(fā)布時間:2023/11/30 asp.net 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net PetShop 4.0的缓存处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在訪問量非常大,但更新較少的網(wǎng)站中使用緩存,可以大大提高程序運行的效率,給網(wǎng)絡(luò)用戶一個良好的體驗效果。在Microsoft提供的經(jīng)典示例項目.Net PetShop 4.0中,也提供了對緩存的支持,本文是作者在學(xué)習(xí)此項目時的一些心得體會,有一些地方還不十分清楚,希望能夠拋磚引玉。

在.Net PetShop 4.0中,非常成功地使用了工廠模式以及接口(interface)、靜態(tài)類(Static class)、抽象類(abstract class)等成員。在使用緩存時,也是通過web.config配置進行設(shè)置,在使用時非常靈活。下面從底向上具體分析.Net PetShop 4.0緩存方面的技術(shù)。

首先看一下該項目中與緩存直接相關(guān)的命名空間:

PetShop.ICacheDependency
PetShop.TableCacheDependency
PetShop.CacheDependencyFactory
PetShop.Web

一、PetShop.ICacheDependency命名空間

最低層應(yīng)該是接口的定義了,在PetShop.ICacheDependency命名空間中只定義了一個接口IPetShopCacheDependency,該接口只有一個方法 GetDependency,沒有任何參數(shù),返回AggregateCacheDependency類型。AggregateCacheDependency是在.NET Framework 2.0 版中是新增的類,組合 ASP.NET 應(yīng)用程序的 Cache 對象中存儲的項和 CacheDependency 對象的數(shù)組之間的多個依賴項(MSDN中原話)。

二、PetShop.TableCacheDependency命名空間

在PetShop.TableCacheDependency命名空間中,提供兩種類:抽象類TableDependency和它的繼承類Category、Item和Product。抽象類TableDependency的構(gòu)造函數(shù)為:

protected?TableDependency(string?configKey)?{

????
string?dbName?=?ConfigurationManager.AppSettings["CacheDatabaseName"];
????
string?tableConfig?=?ConfigurationManager.AppSettings[configKey];
????
string[]?tables?=?tableConfig.Split(configurationSeparator);

????
foreach?(string?tableName?in?tables)
????????dependency.Add(
new?SqlCacheDependency(dbName,?tableName));
}

傳遞了一個參數(shù)configKey,根據(jù)該參數(shù)從web.config文件中獲取表名列表,同時在web.config中獲取數(shù)據(jù)庫名稱。將表名列表中的所有數(shù)據(jù)表添加到AggregateCacheDependency類型的dependency變量中。在此外使用了.NET Framework 2.0 版中是新增的另一個與緩存有關(guān)的SqlCacheDependency類。這個類用于建立ASP.NET應(yīng)用程序的Cache對象中存儲的項和特定SQL Server數(shù)據(jù)庫表之間的聯(lián)系。AggregateCacheDependency和SqlCacheDependency都從CacheDependency繼承而來,但在.NET 2.0中還未提供Oracle等其它數(shù)據(jù)庫對應(yīng)的類。

下面是web.config文件中與緩存相關(guān)的設(shè)置:

<!--?Cache?dependency?options.?Possible?values:?PetShop.TableCacheDependency?for?SQL?Server?and?keep?empty?for?ORACLE?-->
<add?key="CacheDependencyAssembly"?value="PetShop.TableCacheDependency"/>
<!--?CacheDatabaseName?should?match?the?name?under?caching?section,?when?using?TableCacheDependency?-->
<add?key="CacheDatabaseName"?value="MSPetShop4"/>
<!--?*TableDependency?lists?table?dependency?for?each?instance?separated?by?comma?-->
<add?key="CategoryTableDependency"?value="Category"/>
<add?key="ProductTableDependency"?value="Product,Category"/>
<add?key="ItemTableDependency"?value="Product,Category,Item"/>

每個繼承類都只有一個構(gòu)造函數(shù),通過設(shè)置基類的configKey參數(shù)變成了三個不同的類。Product類的構(gòu)造函數(shù)為:

public?Product()?:?base("ProductTableDependency")?{?}

三、PetShop.CacheDependencyFactory命名空間

在PetShop.CacheDependencyFactory命名空間中有兩個類,分別是DependencyAccess和DependencyFacade。如果了解微軟以前提供的一些經(jīng)典例子的分層,便不難理解這兩個類的命名以及它們對應(yīng)的層次級別。這兩個類都是靜態(tài)類,DependencyAccess類里面的方法都是返回IPetShopCacheDependency,而DependencyFacade里面的方法都是返回AggregateCacheDependency。

DependencyAccess類里面關(guān)鍵的一個方法是LoadInstance,它是工廠模式的具體實現(xiàn)。其代碼如下:

private?static?IPetShopCacheDependency?LoadInstance(string?className)?{

????
string?path?=?ConfigurationManager.AppSettings["CacheDependencyAssembly"];
????
string?fullyQualifiedClass?=?path?+?"."?+?className;

????
//?Using?the?evidence?given?in?the?config?file?load?the?appropriate?assembly?and?class
????return?(IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
}

在這個方法中通過配置文件中的設(shè)置和傳進來的參數(shù)className,返回相對應(yīng)的程序集和類。DependencyAccess類里面的其它三個方法,只是調(diào)用這個方法,傳入不同的參數(shù)而已。

DependencyFacade類提供的三個方法正好與DependencyAccess類的三個方法相對應(yīng),分別獲取Category、Item和Product的AggregateCacheDependency。在DependencyFacade類中還讀取了web.config中的CacheDependencyAssembly設(shè)置,從而決定是調(diào)用DependencyAccess對應(yīng)的方法,還是直接返回null。

四、PetShop.Web命名空間

在PetShop.Web的App_Code中,有四個靜態(tài)類與緩存直接相關(guān),分別是CategoryDataProxy、ItemDataProxy、ProductDataProxy和WebUtility。其中前三個分別調(diào)用DependencyFacade對應(yīng)的方法,遺憾的是在哪里(或者說如何)使用這三個類我還沒有完全弄清楚。

WebUtility中有兩個方法GetCategoryName和GetProductName使用了緩存,下面是GetCategoryName的部分代碼:

if?(data?==?null)?{
????
//?Caching?duration?from?Web.config
????int?cacheDuration?=?int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);

????
//?If?the?data?is?not?in?the?cache?then?fetch?the?data?from?the?business?logic?tier
????data?=?category.GetCategory(categoryId).Name;

????
//?Create?a?AggregateCacheDependency?object?from?the?factory
????AggregateCacheDependency?cd?=?DependencyFacade.GetCategoryDependency();

????
//?Store?the?output?in?the?data?cache,?and?Add?the?necessary?AggregateCacheDependency?object
????HttpRuntime.Cache.Add(cacheKey,?data,?cd,?DateTime.Now.AddHours(cacheDuration),?Cache.NoSlidingExpiration,?CacheItemPriority.High,?null);
}

在.Net 2.0中,對緩存的維護有兩種方式:第一種是每次使用緩存之間進行判斷緩存是否存,如果不存在則讀取數(shù)據(jù)存入緩存;另外一種方式是使用CacheItemRemovedCallback委托來實現(xiàn),當(dāng)緩存失效時自動調(diào)用委托過程,重新產(chǎn)生緩存。從上面的代碼來看,.Net PetShop 4.0使用的是第一種方式。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1185077

轉(zhuǎn)載于:https://www.cnblogs.com/yiki/archive/2007/03/15/675503.html

總結(jié)

以上是生活随笔為你收集整理的.Net PetShop 4.0的缓存处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。