簡介 如果您還沒有閱讀過 ASP
NET Caching:Techniques and Best Practices
請閱讀
本文主要以該文章的內容為基礎
尤其是最佳實踐
本文將描述 CacheConfig 類的內部組成
該幫助器類為 Microsoft ASP
NET 中的 Cache 對象提供包裝
該類公開了一個非常簡單的方法
用於完成 ASP
NET 應用程序內的大部分公共緩存工作
使用 CacheConfig類
可以通過翻轉配置設置啟用或禁用緩存
通過配置設置管理所有緩存項和其緩存持續時間
也可以只用一行代碼
使用前面文章中描述的最佳實踐技術來訪問緩存
配置 CacheConfig 從 nfig 文件讀取其所有配置設置
指定的節和該節內的每個鍵值都使用缺省值定義為靜態字符串
如代碼示例
所示
代碼示例
配置節和鍵名
protected static string cacheSettingsConfigName =
CacheSettings
;
protected static string EnableCachingKey =
EnableCaching
;
protected static string RequireKeyDefinitionInConfigKey =
RequireKeyDefinitionInConfig
;
protected static string DefaultCacheDurationUnitsKey =
DefaultCacheDurationUnits
;
protected static string DefaultCacheDurationValueKey =
DefaultCacheDurationValue
;
默認情況下
所有 CacheConfig 配置設置都存儲在名為
CacheSettings
的自定義配置節中
該節被定義為簡單的 NameValueCollection
就像內置的 AppSettings 配置節一樣
必須把該新配置節定義在 nfig 中
如代碼示例
所示
代碼示例
在 nfig 中定義 CacheSettings 配置節
<configSections>
<section name=
CacheSettings
type=
System
Configuration
NameValueFileSectionHandler
System
Version=
Culture=neutral
PublicKeyToken=b
a
c
e
/>
</configSections>
<configSections> 元素必須是 nfig 配置元素中的第一個元素
一旦該節在 nfig 中定義並添加適當的鍵
它將在應用程序中管理 CacheConfig 類的行為
代碼示例
顯示了示例 CacheSettings 節
代碼示例
CacheSettings 鍵和值
<CacheSettings>
<!
true/false
>
<add key=
EnableCaching
value=
true
/>
<!
true/false
>
<add key=
RequireKeyDefinitionInConfig
value=
true
/>
<!
seconds
minutes
or hours
>
<add key=
DefaultCacheDurationUnits
value=
seconds
/>
<!
integer
>
<add key=
DefaultCacheDurationValue
value=
/>
<!
Cache Keys and Durations
use
default
for value to use default otherwise integer
>
<add key=
AuthorsDataTable
value=
default
/>
<add key=
AuthorsDataTableByState
value=
/>
</CacheSettings>
前四個鍵對 CacheConfig 的行為影響最大
最後幾個鍵定義了所有對象的緩存鍵名和緩存持續時間
這些對象存儲在使用 CacheConfig 的緩存中
表
描述了前幾個配置值的效果
表
配置設置和它們的效果
設置 描述
EnableCaching
True/False
當它為 false 時
CacheConfig 被有效禁用
不會向緩存寫項或從緩存讀項
RequireKeyDefinitionInConfig
True/False
當它為 true 時
如果為 CacheConfig 提供了一個鍵但在 nfig 中沒有該鍵
將引發異常
DefaultCacheDurationUnits
seconds
minutes
或
hours
為下一節指定的持續時間值定義單位
用作添加到緩存但沒有指定時間段的項的默認緩存持續時間
DefaultCacheDurationValue
(整數)
指定一個項應該在緩存中存儲的時間長度
使用 DefaultCacheDurationUnits 中定義的單位
用作添加到緩存但沒有指定時間段的項的默認緩存持續時間
由於這只是 CacheConfig 類的
版
所以非常簡單
未來的增強功能可能添加對其他類型關鍵依賴項的支持
例如文件
就像存儲當前設置一樣在配置中存儲文件路徑
大部分緩存都緩存來自 Microsoft SQL Server? 的數據
所以基於時間的緩存就足夠了(至少到 ASP
NET 的緩存 API 可使用 SQL 表緩存無效的內置支持時為止)
首次使用 CacheConfig 是個完全靜態(在 Microsoft Visual Basic 中是共享的)的類
這意味著它永遠不能直接實例化
但是
它的方法可以直接使用
然而
它確實有一個構造函數
每當第一次調用它的某種方法時調用該構造函數
該靜態構造函數執行如下任務
將 CacheSettings 配置節加載到本地 NameValueCollection
根據配置設置對本地 EnableCaching 變量進行設置
根據配置設置對本地 RequireKeyDefinition 變量進行設置
根據配置設置對本地 DefaultCacheDuration TimeSpan 進行設置
檢查 HttpContext(緩存所需)是否可用
如果不可用就把 EnableCaching 設置為 false(在設計時或者從 windows 窗體應用程序調用數據訪問層時避免錯誤)
當第一次引用 CacheConfig 時
靜態構造函數只調用一次
但是
因為所有設置都存儲在 nfig 中
所以任何更新都將導致應用程序完全重啟
這當然意味著下次調用 CacheConfig 將再次運行靜態構造函數並檢索最新的值
基本方法DeCache 我調用的唯一方法是 DeCache
DeCache為給定的鍵從緩存請求出一個值
如果緩存中不存在該值
DeCache將使用作為回調函數提供的方法重新填充緩存
並返回該方法的結果
CacheConfig 還可以用於使用 EnCache()方法簡單地向緩存添加一個項
但幾乎很少使用這個功能
對於每個要緩存的數據類型
都必須有一個單獨的 DeCache 方法
本文提供的 CacheConfig
版僅支持 DataTable 對象
這可以很容易地進行擴展以包含其他的對象
包括 System
Object(如果期望最終的靈活性超越強類型檢查)
但這樣做需要許多重復代碼
一旦 C# 支持通用性
就可以避免許多這種重復代碼
希望能產生該工具的新版本
DeCacheDataTable() 方法支持幾個重載
(string key
GetDataTableCallback callback)
— 當緩存需要為空時
至少需要一個鍵和一個委托來填充緩存
(string key
GetDataTableCallback callback
object[] callbackArguments)
—包含回調方法的參數數組
(string key
GetDataTableCallback callback
object[] callbackArguments
TimeSpan cacheDuration)
—包含一個持續時間
它將重寫在 nfig 中為該鍵指定的任何信息
(string key
GetDataTableCallback callback
object[] callbackArguments
TimeSpan cacheDuration
bool IgnoreCache)
IgnoreCache
—如果不存在將被視為 false
把它設置為 true 將強制跳過緩存
並從原始來源請求值
GetDataTableCallback 委托定義為
public delegate DataTable GetDataTableCallback(object[] args);
因為大部分情況下用於從數據源請求數據的現有方法不使用 (object[] args) 的簽名
所以通常的做法是使用該簽名創建一個新的私有或保護方法
並從現有方法調用它
這種用法的示例如下所示
用法為數據訪問層添加緩存支持 可下載的示例應用程序包含一個非常簡單的 web 應用程序
該應用程序有一個用於列舉 Pubs 數據庫中作者的 Web 窗體和一個用於查詢 Pubs 以獲取這些作者的數據訪問類
數據訪問類 Author
cs
使用 Microsoft 數據訪問應用程序塊最小化數據訪問所需的代碼量
在添加緩存支持之前
它包含兩個方法
ListAuthors() 和 ListAuthors(string state)
每個方法返回一個帶有 Authors 表內容的 DataTable—後者用 state 列的值過濾
添加緩存支持之前的 ListAuthors() 方法如代碼示例
所示
代碼示例
沒有緩存支持的簡單數據訪問方法
public static DataTable ListAuthors()
{
return SqlHelper
ExecuteDataset(ConnectionString
CommandType
Text
SELECT * FROM Authors
)
Tables[
];
}
使用 CacheConfig 為該方法添加緩存支持
必須首先創建一個匹配 GetDataTableCalllback 委托簽名的新重載
這意味著必須返回一個 DataTable 並接受一個對象數組作為它唯一的參數
我們將把實際數據訪問代碼移動到這個新方法中
如代碼示例
所示
代碼示例
把實際數據訪問代碼移動到匹配委托的方法中
protected static DataTable ListAuthors(object[] args)
{
return SqlHelper
ExecuteDataset(ConnectionString
CommandType
Text
SELECT * FROM Authors
)
Tables[
];
}
創建新方法後
更改原始方法以使用 CacheConfig
DeCache() 方法
並向它發送一個引用新 ListAuthors(object[]) 方法的回調函數
代碼示例
顯示了 ListAuthors() 的新版本
代碼示例
ListAuthors()
現在修改為包含緩存支持
public sta
From:http://tw.wingwit.com/Article/program/net/201311/11320.html