亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

asp.net SAF 中緩存服務(wù)的實現(xiàn)第1/5頁

 更新時間:2008年08月08日 21:28:49   作者:  
對緩存的興趣源于張子陽寫的一篇文章《SAF 中緩存服務(wù)的實現(xiàn)》中的一個例子:
復(fù)制代碼 代碼如下:

protected void Page_Load(object sender, EventArgs e)    
{    
    webinfo info = new webinfo();    
    Response.Write("有static的執(zhí)行結(jié)果:" + webinfo.a + "<br />");    
    Response.Write("沒有static的執(zhí)行結(jié)果:" + info.b);    
}    

public class webinfo    
{    
    public static DateTime a = DateTime.Now;    
    public DateTime b = DateTime.Now;    
}   

下面內(nèi)容多摘自該文章:結(jié)果是只要站點不重啟(代碼也不修改),那么a的值是恒定不變的,即使將頁面關(guān)了重新打開也一樣;而b則是刷新就變化。如果你從事Asp.Net的開發(fā),提起緩存你可能首先會想到Output Cache、數(shù)據(jù)源緩存或者是基于System.Web.Caching.Cache的對象緩存。實際上緩存的目的就是把對象(數(shù)據(jù))存儲在內(nèi)存中,不用每次需要對象服務(wù)的時候都重新創(chuàng)建對象(相對耗時)。將對象聲明為static,那么對象將在其所屬的類被載入AppDomain時初始化,這樣對象的生命周期與AppDomain同樣長,從而起到緩存的目的。

設(shè)計思想 
       我們經(jīng)常需要在應(yīng)用程序中緩存一些常用數(shù)據(jù)供全局使用以提升性能。如果需要緩存的對象類型和數(shù)目是固定的,我們可能會直接將其聲明為static;如果我們需要緩存的對象類型和數(shù)目是不定的,我們可能會借助一個static Hashtable來實現(xiàn)。但是Hashtable有個缺陷:它沒有層次結(jié)構(gòu),它總是以鍵/值的形式來存儲數(shù)據(jù),一個Key對應(yīng)一個Value,如果我們想獲取相關(guān)聯(lián)的一組數(shù)據(jù)就會比較困難了。 

       XML文檔結(jié)構(gòu)是樹形的,具有標(biāo)準(zhǔn)的層次結(jié)構(gòu)。XPath用于從Xml文檔中選擇一個或多個結(jié)點。比如 "/BookStore/Book",選擇Book結(jié)點下的所有子結(jié)點。 

       SAF 中的緩存服務(wù)通過一個在內(nèi)存中動態(tài)構(gòu)造的Xml文檔樹作為橋梁,將靜態(tài)(static)緩存和XPath 這兩個技術(shù)結(jié)合了起來,支持使用XPath的語法來獲取Hashtable中對象。其中靜態(tài)緩存進(jìn)行實際的數(shù)據(jù)緩存,XPath用于獲取數(shù)據(jù)對象。從程序員的角度來看,即是Hashtable的Key支持了XPath的語法,可以將原本“平板式”的Hashtable想象成為一個“樹形結(jié)構(gòu)”,它的結(jié)點包含了緩存的數(shù)據(jù),我們通過標(biāo)準(zhǔn)的XPath到達(dá)結(jié)點(當(dāng)然這只是一個假象)并獲取數(shù)據(jù)。通過這種方式就可以使用XPath來一次獲取Hashtable中的多個相關(guān)數(shù)據(jù)對象。 簡單說,SAF緩存服務(wù)是為了實現(xiàn)一個有層次(樹形)的緩存結(jié)構(gòu),從而實現(xiàn)對緩存更加靈活的操作。

而實際上是怎么實現(xiàn)這一過程的呢?我們一步步來看:
1、首先在內(nèi)存中動態(tài)構(gòu)建一個 Xml文檔,它只包含一個根結(jié)點,可以任意命名,這里將它命名為了Cache。
2、提供一個Xpath路徑:獲取對象(數(shù)據(jù))前首先要存儲對象,存對象自然要先提供一個路徑(這里稱為“路徑”,是因為它是一個XPath,實際上也就相當(dāng)于Hashtable中的鍵Key)。
3、根據(jù)上一步提供的路徑,以Cache為根結(jié)點,逐層深入地創(chuàng)建XmlNode結(jié)點。
4、生成一個GUID,在葉結(jié)點上添加一個Key屬性,為這個Key屬性賦值為GUID。
5、在Hashtable中存儲對象,其中Hashtable的Key即為上一步生成的GUID,而Value為要存儲的對象。

       使用這種方式,Hashtable的實際的Key,即動態(tài)生成的GUID對程序員來說是透明的,程序員在存儲/獲取對象時,只需要提供XPath表達(dá)式就可以。下面這幅圖說明了它們之間的關(guān)系:

這里還需要再說明三點:
1、我們使用Hashtable存儲對象,可以直接將Hashtable聲明為static的,也可以將Hashtable聲明為instance的,但是將Hashtable所屬的對象聲明為static的。這里應(yīng)用了Singleton模式,先將對Hashtable的操作封裝成一個類,然后在這個類上應(yīng)用Singleton模式,確保了這個類只有一個(這個類所維護(hù)的Hashtable實例自然也只有一個了)。很明顯,這個類包含了主要的邏輯,我們將之命名為Cache。
2、使用Hashtable的好處是可以存儲任何類型的對象,缺點是喪失了類型安全。有時候我們可能會想使用一個泛型集合類來取代Hashtable,比如Dictionary<T key, T value>。所以這里又引入了Strategy模式,創(chuàng)建了一個ICacheStrategy接口,這個接口包括三個方法,分別用于添加、獲取、刪除對象。
3、用Xpath獲取結(jié)點時,可以是基于當(dāng)前結(jié)點的相對路徑;也可以是基于根結(jié)點的絕對路徑。在本文的范例程序中,使用的是絕對路徑,顯然這樣更加方便一些。

相關(guān)文章

最新評論