為 ASP.NET 建立緩衝設定物件發布日期: 4/1/2004 | 更新日期: 4/1/2004
Steven A. Smith
ASPAlliance.com
適用於:
Microsoft ASP.NET
摘要:瞭解 CacheConfig 協助器類如何改善 ASP.NET 應用程式中的緩衝策略,如何改善快取資料的重用,以及如何大幅減少程式碼數以實現使用最佳實務的緩衝。本文建立在文檔 ASP.NET Caching:Techniques and Best Pratices 的基礎上。(7 頁列印頁)
下載 CacheConfigDemo.msi。
本頁內容
|
簡介 |
|
配置 |
|
首次使用 |
|
基本方法:DeCache |
|
用法:為資料訪問層添加緩衝支援 |
|
小結 |
|
資源 |
簡介
如果您還沒有閱讀過 ASP.NET Caching:Techniques and Best Practices,請閱讀。本文主要以該文章的內容為基礎,尤其是最佳實務。本文將描述 CacheConfig 類的內部組成,該協助器類為 Microsoft ASP.NET 中的 Cache 對象提供封裝。該類公開了一個非常簡單的方法,用於完成 ASP.NET 應用程式內的大部分公用緩衝工作。使用 CacheConfig類,可以通過翻轉配置設定啟用或禁用緩衝,通過配置設定管理所有快取項目和其緩衝期間,也可以只用一行代碼,使用前面文章中描述的最佳實務技術來訪問緩衝。
返回頁首
配置
CacheConfig 從 web.config 檔案讀取其所有配置設定。指定的節和該節內的每個索引值都使用預設值定義為靜態字串,如程式碼範例 1 所示。
程式碼範例 1. 配置節和鍵名
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 配置節一樣。必須把該新配置節定義在 web.config 中,如程式碼範例 2 所示。
程式碼範例 2. 在 web.config 中定義 CacheSettings 配置節
<configSections> <section name="CacheSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
<configSections> 元素必須是 web.config 配置元素中的第一個元素。
一旦該節在 web.config 中定義並添加適當的鍵,它將在應用程式中管理 CacheConfig 類的行為。程式碼範例 3 顯示了樣本 CacheSettings 節。
程式碼範例 3. 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="30" /> <!-- Cache Keys and Durations - use "default" for value to use default otherwise integer. --> <add key="AuthorsDataTable" value="default" /> <add key="AuthorsDataTableByState" value="10" /> </CacheSettings>
前四個鍵對 CacheConfig 的行為影響最大。最後幾個鍵定義了所有對象的緩衝鍵名和緩衝期間,這些Object Storage Service在使用 CacheConfig 的緩衝中。表 1 描述了前幾個配置值的效果。
表 1. 配置設定和它們的效果
| 設定 |
描述 |
EnableCaching |
True/False。當它為 false 時, CacheConfig 被有效禁用,不會向緩衝寫項或從緩衝讀項。 |
RequireKeyDefinitionInConfig |
True/False。當它為 true 時,如果為 CacheConfig 提供了一個鍵但在 web.config 中沒有該鍵,將引發異常。 |
DefaultCacheDurationUnits |
"seconds"、"minutes" 或 "hours"。為下一節指定的期間值定義單位。用作添加到緩衝但沒有指定時間段的項的預設緩衝期間。 |
DefaultCacheDurationValue |
(整數)。指定一個項應該在緩衝中儲存的時間長度,使用 DefaultCacheDurationUnits 中定義的單位。用作添加到緩衝但沒有指定時間段的項的預設緩衝期間。 |
由於這隻是 CacheConfig 類的 1.0 版,所以非常簡單。未來的增強功能可能添加對其他類型關鍵依賴項的支援,例如檔案,就像儲存當前設定一樣在配置中隱藏檔路徑。大部分緩衝都緩衝來自 Microsoft SQL Server? 的資料,所以基於時間的緩衝就足夠了(至少到 ASP.NET 的緩衝 API 可使用 SQL 表快取無效判定的內建支援時為止)。
返回頁首
首次使用
CacheConfig 是個完全靜態(在 Microsoft Visual Basic 中是共用的)的類,這意味著它永遠不能直接執行個體化。但是,它的方法可以直接使用。然而,它確實有一個建構函式,每當第一次調用它的某種方法時調用該建構函式。該靜態建構函式執行如下任務:
| • |
將 CacheSettings 配置節載入到本地 NameValueCollection. |
| • |
根據配置設定對本地 EnableCaching 變數進行設定。 |
| • |
根據配置設定對本地 RequireKeyDefinition 變數進行設定。 |
| • |
根據配置設定對本地 DefaultCacheDuration TimeSpan 進行設定。 |
| • |
檢查 HttpContext(緩衝所需)是否可用,如果不可用就把 EnableCaching 設定為 false(在設計時或者從 windows 表單應用程式調用資料訪問層時避免錯誤)。 |
當第一次引用 CacheConfig 時,靜態建構函式只調用一次。但是,因為所有設定都儲存在 web.config 中,所以任何更新都將導致應用程式完全重啟,這當然意味著下次調用 CacheConfig 將再次運行靜態建構函式並檢索最新的值。
返回頁首
基本方法:DeCache
我調用的唯一方法是 DeCache。DeCache為給定的鍵從緩衝請求出一個值。如果緩衝中不存在該值,DeCache將使用作為回呼函數提供的方法重新填充緩衝,並返回該方法的結果。CacheConfig 還可以用於使用 EnCache()方法簡單地向緩衝添加一個項,但幾乎很少使用這個功能。
對於每個要緩衝的資料類型,都必須有一個單獨的 DeCache 方法。本文提供的 CacheConfig 1.0 版僅支援 DataTable 對象。這可以很容易地進行擴充以包含其他的對象,包括 System.Object(如果期望最終的靈活性超越強型別檢查),但這樣做需要許多重複代碼。一旦 C# 支援通用性,就可以避免許多這種重複代碼,希望能產生該工具的新版本。
DeCacheDataTable() 方法支援幾個重載:
(string key, GetDataTableCallback callback)
— 當緩衝需要為空白時,至少需要一個鍵和一個委託來填充緩衝。
(string key, GetDataTableCallback callback, object[] callbackArguments)
—包含回調方法的參數數組。
(string key, GetDataTableCallback callback, object[] callbackArguments, TimeSpan cacheDuration)
—包含一個期間,它將重寫在 web.config 中為該鍵指定的任何資訊。
(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 Form和一個用於查詢 Pubs 以擷取這些作者的資料訪問類。資料訪問類 Author.cs,使用 Microsoft 資料訪問應用程式塊最小化資料訪問所需的代碼量。在添加緩衝支援之前,它包含兩個方法:ListAuthors() 和 ListAuthors(string state)。每個方法返回一個帶有 Authors 表內容的 DataTable—後者用 state 列的值過濾。添加緩衝支援之前的 ListAuthors() 方法如程式碼範例 4 所示。
程式碼範例 4. 沒有緩衝支援的簡單資料存取方法
public static DataTable ListAuthors() { return SqlHelper.ExecuteDataset(ConnectionString, CommandType.Text, "SELECT * FROM Authors").Tables[0]; }
使用 CacheConfig 為該方法添加緩衝支援,必須首先建立一個匹配 GetDataTableCalllback 委託簽名的新重載,這意味著必須返回一個 DataTable 並接受一個對象數組作為它唯一的參數。我們將把實際資料存取碼移動到這個新方法中,如程式碼範例 5 所示。
程式碼範例 5. 把實際資料存取碼移動到匹配委託的方法中。
protected static DataTable ListAuthors(object[] args) { return SqlHelper.ExecuteDataset(ConnectionString, CommandType.Text, "SELECT * FROM Authors").Tables[0]; }
建立新方法後,更改原始方法以使用 CacheConfig.DeCache() 方法,並向它發送一個引用新 ListAuthors(object[]) 方法的回呼函數。程式碼範例 6 顯示了 ListAuthors() 的新版本。
程式碼範例 6. ListAuthors(),現在修改為包含緩衝支援
public static DataTable ListAuthors() { GetDataTableCallback callback = new GetDataTableCallback(Author.ListAuthors); return CacheConfig.DeCacheDataTable("AuthorsDataTable", callback, new SqlParameter[]{null}); }
提供的範例程式碼包含了 ListAuthors() 的另一個重載,用於支援根據 state 篩選,它通過稍微更改 SQL 及使用發送給它的參數數組共用使用保護方法。
返回頁首
小結
通過在 ASP.NET 應用程式中引用 CacheConfig並用於所有它支援的快取作業,您可以對緩衝策略進行更多的控制,並對使用最佳實務技術引用緩衝有更強的自信。儘管被限制為 DataTable 對象,並且 DataTable 對象在當前表單的到期時間是絕對的,但是通過使用任何希望定義的依賴項,CacheConfig類很容易進行擴充以封裝任何其他類型的需要緩衝的可序列化對象。
返回頁首
資源
ASP.NET Caching:Techniques and Best Practices
關於作者
Steven A. Smith,Microsoft ASP.NET MVP,是 ASPAlliance.com 的總裁和所有者。他還是 ASPSmith Ltd (一家專註於 .NET 的培訓公司)的所有者和首席講師。他著有兩本書:ASP.NET Developer's Cookbook 和 ASP.NET By Example,還在 MSDN 和 AspNetPRO 雜誌發表過文章。Steve 每年都要在一些會議上發表演講,他是 INETA speaker's bureau 和 ASPInsiders 的成員。Steve 擁有企業管理碩士學位和電腦科學工程理學士學位。
可寄送電子郵件至 ssmith@aspalliance.com聯絡 Steve。
轉到原英文頁面