資源描述:
《五十七:在分層架構(gòu)中緩存數(shù)據(jù)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、在ASP.NET2.0中操作數(shù)據(jù)之五十七:在分層架構(gòu)中緩存數(shù)據(jù)作者:heker2007字體:[增加?減小]類(lèi)型:轉(zhuǎn)載時(shí)間:2016-05-17?我要評(píng)論上一篇文章我們介紹了ASP.NET2.0中使用ObjectDataSource在視圖層緩存數(shù)據(jù),缺點(diǎn)是不言而喻的,為了達(dá)到低耦合,本文介紹如何在三層架構(gòu)中使用緩存技術(shù)來(lái)緩存數(shù)據(jù)。導(dǎo)言: 正如前面章節(jié)所言,緩存ObjectDataSource的數(shù)據(jù)只需要簡(jiǎn)單的設(shè)置一些屬性。然而,它是在表現(xiàn)層對(duì)數(shù)據(jù)緩存,這就與ASP.NETpage頁(yè)面緩存策略(cachingpo
2、licies)緊密的耦合(tightlycouples)起來(lái)。我們對(duì)體系機(jī)構(gòu)分層的原因之一便是打破這種耦合。拿業(yè)務(wù)邏輯層為例,將業(yè)務(wù)邏輯從ASP.NET頁(yè)面脫離出來(lái);而數(shù)據(jù)訪(fǎng)問(wèn)層將數(shù)據(jù)訪(fǎng)問(wèn)的細(xì)節(jié)ASP.NET頁(yè)面脫離出來(lái)。從某種意義來(lái)說(shuō),將業(yè)務(wù)邏輯和數(shù)據(jù)訪(fǎng)問(wèn)細(xì)節(jié)脫離出來(lái)是首先,這樣的話(huà)使系統(tǒng)更易讀、易維護(hù)、易修改,便于按模塊分工—比如,表現(xiàn)層的開(kāi)發(fā)者對(duì)數(shù)據(jù)庫(kù)的細(xì)節(jié)不甚了解也不妨礙其開(kāi)發(fā)工作。當(dāng)然,將緩存策略從表現(xiàn)層脫離出來(lái)也有類(lèi)似的好處?! ”疚奈覀儗?duì)層次機(jī)構(gòu)進(jìn)行擴(kuò)充,新添一個(gè)緩存層(CachingLayer
3、,簡(jiǎn)稱(chēng)CL)以實(shí)施緩存策略。該緩存層包括一個(gè)ProductsCL類(lèi),該類(lèi)用類(lèi)似GetProducts(),GetProductsByCategoryID(categoryID)等方法來(lái)訪(fǎng)問(wèn)產(chǎn)品信息。調(diào)用這些方法時(shí)先從內(nèi)存檢索數(shù)據(jù),如果內(nèi)存為空則調(diào)用業(yè)務(wù)邏輯層BLL里的ProductsBLL類(lèi)的相應(yīng)方法,再?gòu)臄?shù)據(jù)訪(fǎng)問(wèn)層DAL返回獲取的數(shù)據(jù)。該P(yáng)roductsCL類(lèi)的方法從業(yè)務(wù)邏輯層BLL獲取數(shù)據(jù)后先對(duì)數(shù)據(jù)緩存后再返回。如圖1所示,緩存層CL位于表現(xiàn)層和業(yè)務(wù)邏輯層。圖1:在我們的體系結(jié)構(gòu)中緩存層(CL)是單獨(dú)的一層
4、第一步:創(chuàng)建緩存層的類(lèi) 在本文,我們創(chuàng)建的緩存層僅僅包含一個(gè)ProductsCL類(lèi),它只有幾個(gè)方法。 完整的緩存層還應(yīng)該包含CategoriesCL,EmployeesCL,和SuppliersCL類(lèi)。有了業(yè)務(wù)邏輯層BLL和數(shù)據(jù)訪(fǎng)問(wèn)層DAL,緩存層完全可以當(dāng)成一個(gè)單獨(dú)的類(lèi)庫(kù)工程(ClassLibraryproject),不過(guò)我們將它作為App_Code文件夾里的一個(gè)類(lèi)來(lái)處理。 為了更好的將緩存層類(lèi)和DAL類(lèi)、BLL類(lèi)區(qū)分開(kāi),我們?cè)贏pp_Code文件夾里創(chuàng)建一個(gè)新的子文件夾。在資源管理器里右擊App_Co
5、de文件夾,選擇“新文件夾”,命名為CL,在里面添加新類(lèi)ProductsCL.cs圖2:添加名為CL的文件夾和名為ProductsCL.cs的類(lèi) 跟BLL里的ProductsBLL類(lèi)一樣,ProductsCL類(lèi)應(yīng)該包含相同的數(shù)據(jù)訪(fǎng)問(wèn)和修改方法。不過(guò)在本文,我們只創(chuàng)建GetProducts()方法(在第3步)和GetProductsByCategoryID(categoryID)方法(在第4步)。你可以在空閑的時(shí)候?qū)roductsCL類(lèi)進(jìn)行完善,并創(chuàng)建相應(yīng)的CategoriesCL,EmployeesCL和S
6、uppliersCL類(lèi)第二步:對(duì)DataCache進(jìn)行讀和寫(xiě) ObjectDataSource的緩存屬性使用ASP.NETdatacache來(lái)存儲(chǔ)從BLL獲取的數(shù)據(jù)。要訪(fǎng)問(wèn)datacache,可以從ASP.NET頁(yè)面的code-behindclasses類(lèi)或體系結(jié)構(gòu)層(architecture)的類(lèi)來(lái)訪(fǎng)問(wèn)。要通過(guò)ASP.NET頁(yè)面的code-behindclasses類(lèi)對(duì)datacache進(jìn)行讀寫(xiě),可使用如下模式:?12//Readfromthecache(讀)objectvalue=Cache["key"]
7、;?12345//Addanewitemtothecache(寫(xiě))Cache["key"]=value;Cache.Insert(key,value);Cache.Insert(key,value,CacheDependency);Cache.Insert(key,value,CacheDependency,DateTime,TimeSpan); Cacheclass類(lèi)的Insert方法可以有很多的重載。Cache["key"]=value和Cache.Insert(key,value)是相同的,都是向cac
8、he添加一個(gè)條目(item),不過(guò)沒(méi)有指定expiry(可以理解為緩存持續(xù)時(shí)間)。更具代表性的是,在我們向cache添加條目的時(shí)候指定一個(gè)expiry,它要么是dependency(從屬體),要么是time-basedexpiry,又或者兩者兼而有之,比如上面的最后2個(gè)表達(dá)式。 如果所需的數(shù)據(jù)存儲(chǔ)在內(nèi)存的話(huà),首先調(diào)用緩存層的方法返回?cái)?shù)據(jù)。如果不在內(nèi)存的話(huà)就調(diào)用BLL里相應(yīng)的方法。數(shù)據(jù)