復制代碼 代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
webinfo info = new webinfo();
Response.Write("有static的執行結果:" + webinfo.a + "<br />");
Response.Write("沒有static的執行結果:" + info.b);
}
public class webinfo
{
public static DateTime a = DateTime.Now;
public DateTime b = DateTime.Now;
}
下面內容多摘自該文章:結果是只要站點不重啟(代碼也不修改),那麼a的值是恆定不變的,即使將頁面關了重新打開也一樣;而b則是刷新就變化。如果你從事Asp.Net的開發,提起緩存你可能首先會想到Output Cache、數據源緩存或者是基於System.Web.Caching.Cache的對象緩存。實際上緩存的目的就是把對象(數據)存儲在內存中,不用每次需要對象服務的時候都重新創建對象(相對耗時)。將對象聲明為static,那麼對象將在其所屬的類被載入AppDomain時初始化,這樣對象的生命周期與AppDomain同樣長,從而起到緩存的目的。
設計思想
我們經常需要在應用程序中緩存一些常用數據供全局使用以提升性能。如果需要緩存的對象類型和數目是固定的,我們可能會直接將其聲明為static;如果我們需要緩存的對象類型和數目是不定的,我們可能會借助一個static Hashtable來實現。但是Hashtable有個缺陷:它沒有層次結構,它總是以鍵/值的形式來存儲數據,一個Key對應一個Value,如果我們想獲取相關聯的一組數據就會比較困難了。
XML文檔結構是樹形的,具有標准的層次結構。XPath用於從Xml文檔中選擇一個或多個結點。比如 "/BookStore/Book",選擇Book結點下的所有子結點。
SAF 中的緩存服務通過一個在內存中動態構造的Xml文檔樹作為橋梁,將靜態(static)緩存和XPath 這兩個技術結合了起來,支持使用XPath的語法來獲取Hashtable中對象。其中靜態緩存進行實際的數據緩存,XPath用於獲取數據對象。從程序員的角度來看,即是Hashtable的Key支持了XPath的語法,可以將原本“平板式”的Hashtable想象成為一個“樹形結構”,它的結點包含了緩存的數據,我們通過標准的XPath到達結點(當然這只是一個假象)並獲取數據。通過這種方式就可以使用XPath來一次獲取Hashtable中的多個相關數據對象。 簡單說,SAF緩存服務是為了實現一個有層次(樹形)的緩存結構,從而實現對緩存更加靈活的操作。
而實際上是怎麼實現這一過程的呢?我們一步步來看:
1、首先在內存中動態構建一個 Xml文檔,它只包含一個根結點,可以任意命名,這裡將它命名為了Cache。
2、提供一個Xpath路徑:獲取對象(數據)前首先要存儲對象,存對象自然要先提供一個路徑(這裡稱為“路徑”,是因為它是一個XPath,實際上也就相當於Hashtable中的鍵Key)。
3、根據上一步提供的路徑,以Cache為根結點,逐層深入地創建XmlNode結點。
4、生成一個GUID,在葉結點上添加一個Key屬性,為這個Key屬性賦值為GUID。
5、在Hashtable中存儲對象,其中Hashtable的Key即為上一步生成的GUID,而Value為要存儲的對象。
使用這種方式,Hashtable的實際的Key,即動態生成的GUID對程序員來說是透明的,程序員在存儲/獲取對象時,只需要提供XPath表達式就可以。下面這幅圖說明了它們之間的關系:
這裡還需要再說明三點:
1、我們使用Hashtable存儲對象,可以直接將Hashtable聲明為static的,也可以將Hashtable聲明為instance的,但是將Hashtable所屬的對象聲明為static的。這裡應用了Singleton模式,先將對Hashtable的操作封裝成一個類,然後在這個類上應用Singleton模式,確保了這個類只有一個(這個類所維護的Hashtable實例自然也只有一個了)。很明顯,這個類包含了主要的邏輯,我們將之命名為Cache。
2、使用Hashtable的好處是可以存儲任何類型的對象,缺點是喪失了類型安全。有時候我們可能會想使用一個泛型集合類來取代Hashtable,比如Dictionary<T key, T value>。所以這裡又引入了Strategy模式,創建了一個ICacheStrategy接口,這個接口包括三個方法,分別用於添加、獲取、刪除對象。
3、用Xpath獲取結點時,可以是基於當前結點的相對路徑;也可以是基於根結點的絕對路徑。在本文的范例程序中,使用的是絕對路徑,顯然這樣更加方便一些。
當前1/5頁
12345下一頁閱讀全文