2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  畢業(yè)設(shè)計(jì)論文</b></p><p>  系部 軟件學(xué)院 </p><p>  專業(yè) 軟件技術(shù)/應(yīng)用英語 </p><p>  題目 個(gè)人博客系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) </p>

2、<p>  指導(dǎo)教師 </p><p>  評(píng)閱教師 </p><p>  畢業(yè)設(shè)計(jì)(論文)中文摘要</p><p>  畢業(yè)設(shè)計(jì)(論文)外文摘要</p><p><b>  目

3、錄</b></p><p>  1 緒論- 1 -</p><p>  1.1 博客概況- 1 -</p><p>  1.1.1 博客的產(chǎn)生- 1 -</p><p>  1.1.2 博客的現(xiàn)狀- 2 -</p><p>  1.2 博客的發(fā)展、需求與前景- 2 -</p><

4、;p>  1.3 本論文任務(wù)概述- 2 -</p><p>  1.4 本論文章節(jié)安排- 3 -</p><p>  2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)- 3 -</p><p>  2.1 需求分析- 3 -</p><p>  2.1.1 功能需求- 3 -</p><p>  2.1.2 項(xiàng)目計(jì)劃安排- 3 -

5、</p><p>  2.2 系統(tǒng)開發(fā)環(huán)境- 4 -</p><p>  2.2.1開發(fā)環(huán)境簡介- 4 -</p><p>  2.2.2 Visual Studio 2008開發(fā)環(huán)境簡介- 5 -</p><p>  2.2.3 SQL Server 2005數(shù)據(jù)庫簡介- 5 -</p><p>  2.3相

6、關(guān)技術(shù)簡介- 5 -</p><p>  2.3.1 C#語言簡介- 5 -</p><p>  2.3.2 ASP.NET 簡介- 6 -</p><p>  2.3.3 ADO.NET 簡介- 6 -</p><p>  2.3.4 Silverlight技術(shù)簡介- 7 -</p><p>  2.3.5

7、 WCF簡介- 7 -</p><p>  2.3.6 jQuery庫簡介- 8 -</p><p>  2.4系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)- 8 -</p><p>  2.4.1 分層架構(gòu)核心思想- 8 -</p><p>  2.4.2 實(shí)體介紹- 9 -</p><p>  2.4.3 數(shù)據(jù)庫設(shè)計(jì)- 10 -&l

8、t;/p><p>  2.4.4 實(shí)體類的設(shè)計(jì)與實(shí)現(xiàn)- 12 -</p><p>  2.4.5 接口設(shè)計(jì)- 12 -</p><p>  2.4.6 IoC 容器及依賴注入機(jī)制的設(shè)計(jì)- 14 -</p><p>  2.4.7 數(shù)據(jù)訪問層的實(shí)現(xiàn)- 17 -</p><p>  2.4.8 業(yè)務(wù)邏輯層的實(shí)現(xiàn)- 2

9、4 -</p><p>  2.4.9 表示層的實(shí)現(xiàn)- 26 -</p><p>  2.4.10 視頻模塊的實(shí)現(xiàn)- 28 -</p><p>  3 系統(tǒng)功能演示- 30 -</p><p>  3.1系統(tǒng)功能演示- 30 -</p><p>  3.2小結(jié)- 36 -</p><p&g

10、t;<b>  1 緒論</b></p><p>  忽如一夜春風(fēng)來,“上網(wǎng)”突然成了很“cool”的事,網(wǎng)上影院、伊妹兒、QQ、黑客……越來越多的網(wǎng)絡(luò)語言融入了我們的日常用語,網(wǎng)絡(luò)成了我們生活一部分。電腦起源于二戰(zhàn),而網(wǎng)絡(luò)則不折不扣的起源于冷戰(zhàn)。網(wǎng)絡(luò)的正常穩(wěn)定發(fā)展是從1995年以后,從1995年到至今,短短的十幾年間,Internet進(jìn)入了全速發(fā)展時(shí)期,它已經(jīng)成為我們生活中不可缺少的重要一

11、環(huán)了。</p><p>  Internet規(guī)模逐日擴(kuò)大,人們對(duì)網(wǎng)絡(luò)速度的要求也越來越高。信息的獲取、處理、交流和應(yīng)用能力,已經(jīng)成為人們最重要的能力之一。而在網(wǎng)絡(luò)上,發(fā)布、查看相關(guān)信息的方式也越來越多,比如門戶網(wǎng)站,新聞組,電子郵件,還有最近幾年流行起來的BBS, 博客,播客,貼吧等等。博客是一種基于互聯(lián)網(wǎng)分享個(gè)人心得及其他一些個(gè)人認(rèn)為是有用信息的方式。從發(fā)展之初,博客就帶有雙重功能,一方面它是很棒的在線寫日志的

12、工具,另一方面也是絕佳的交流工具。</p><p><b>  1.1 博客概況</b></p><p>  1.1.1 博客的產(chǎn)生</p><p>  “博客”這個(gè)詞,最早起源于中國,史學(xué)界普遍認(rèn)為最早來自于中國秦代。當(dāng)時(shí)張良為了刺殺秦始皇,找到一位俠客,并選定博浪沙作為刺殺地點(diǎn),結(jié)果刺殺失敗。但大秦帝國還是被這一突發(fā)事件所震驚,紛紛在第一時(shí)

13、間予以報(bào)道。無數(shù)竹簡在驛道上往返奔馳,上面的新聞只刻著一行朱色的篆字:“博浪沙之俠客。”由此可見,“博客”的最初含義是指突發(fā)性大事件。后來這個(gè)詞的意義被進(jìn)一步引申,代指“值得一看的東西”、“另人震驚的事件”或“富有新聞價(jià)值的言論”。</p><p>  最古老的博客原型是NCSA的“What's New Page”網(wǎng)頁,主要是羅列Web上新興的網(wǎng)站索引,這個(gè)頁面從93年6月開始,一直更新到1996年6月為

14、止。但是最早的博客是Userland公司CEO Dave Winer,在1997年開始運(yùn)作的Scripting News開始真正具備了博客的基本重要特性。并且他將這些功能集成到免費(fèi)軟件“Frontier腳本環(huán)境”。不過,這個(gè)算不算是真正的最早博客,爭議頗多。有人認(rèn)為,從形式上說,是Jorn Barger于1997年底建立了今天博客網(wǎng)站的基本模樣(當(dāng)時(shí)的原始模樣可以上網(wǎng)看到。網(wǎng)管人員使用log(log files)來指稱“系統(tǒng)記錄文件”,

15、因此幾年前如果用google來查weblog,查出來大多都是例如Seacloak這種網(wǎng)站流量分析軟件,而不像今天真正的weblog。</p><p>  1.1.2 博客的現(xiàn)狀</p><p>  博客(Blog)在中國的發(fā)展歷程始于1998年,但到了2000年才開始真正流行。而2000年博客開始進(jìn)入中國,并迅速發(fā)展,但都業(yè)績平平。直到2004年木子美事件,才讓中國民眾了解到了博客,并運(yùn)用

16、博客。2005年,國內(nèi)各門戶網(wǎng)站,如新浪、搜狐,原不看好博客業(yè)務(wù),也加入博客陣營,開始進(jìn)入博客春秋戰(zhàn)國時(shí)代。起初,Bloggers將其每天瀏覽網(wǎng)站的心得和意見記錄下來,并予以公開,來給其他人參考和遵循。但隨著Blogging快速擴(kuò)張,它的目的與最初已相去甚遠(yuǎn)。目前網(wǎng)絡(luò)上數(shù)以千計(jì)的Bloggers發(fā)表和張貼Blog的目的有很大的差異。不過,由于溝通方式比電子郵件、討論群組更簡單和容易,Blog已成為家庭、公司、部門和團(tuán)隊(duì)之間越來越盛行的溝

17、通工具,因?yàn)樗仓饾u被應(yīng)用在企業(yè)內(nèi)部網(wǎng)絡(luò)(Intranet)。</p><p>  1.2 博客的發(fā)展、需求與前景</p><p>  2001年9月11日,世貿(mào)大樓遭遇恐怖襲擊,博客成為重要信息和災(zāi)難親身體驗(yàn)的重要來源。從此,博客正式步入主流社會(huì)的視野。正是這場恐怖的襲擊,使人們對(duì)于生命的脆弱、人與人溝通的重要、最即時(shí)最有效的信息傳遞方式,有了全新的認(rèn)識(shí)。</p><

18、p>  從發(fā)展之初,博客就帶有雙重功能,一方面它是很棒的在線寫日志的工具,它可以記錄個(gè)人的生活,以文字形式展現(xiàn)自我,同時(shí)也能讓網(wǎng)絡(luò)上的其他人來了解自己,博客就是一個(gè)展示自我的舞臺(tái);另一方面博客也是絕佳的交流工具,利用博客可以發(fā)一些重要的新聞,以最直接、最高效的方式來與他人溝通。正如世貿(mào)大樓遭遇恐怖襲擊事件,網(wǎng)絡(luò)成為第一個(gè)事件信息的來源,由此可見博客的重要性。開發(fā)一個(gè)個(gè)人博客系統(tǒng),就是基于這樣一個(gè)想法,通過各種方式來展現(xiàn)自我,與他人

19、溝通。</p><p>  1.3 本論文任務(wù)概述</p><p>  這個(gè)畢業(yè)設(shè)計(jì)的最終目標(biāo)是設(shè)計(jì)、實(shí)現(xiàn)一個(gè)功能完善的個(gè)人博客系統(tǒng)。這個(gè)系統(tǒng)是基于.NET Framework 3.5運(yùn)用ASP.NET 2.0技術(shù)來實(shí)現(xiàn)的,開發(fā)語言是C#語言。在這個(gè)系統(tǒng)中將利用一些較新的技術(shù)來增加用戶體驗(yàn)。</p><p>  我負(fù)責(zé)整個(gè)系統(tǒng)的架構(gòu)設(shè)計(jì)、編碼、測(cè)試等。這篇論文我主要

20、先對(duì)博客進(jìn)行簡要的介紹,然后介紹了開發(fā)本系統(tǒng)所用到的新技術(shù),接著對(duì)整個(gè)系統(tǒng)中的模塊進(jìn)行設(shè)計(jì),然后既要剖析部分代碼,最后演示完整的系統(tǒng)。</p><p>  1.4 本論文章節(jié)安排</p><p>  第二章開始介紹了系統(tǒng)開發(fā)環(huán)境及相關(guān)技術(shù)。接著詳細(xì)介紹了系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),分別從需求分析、數(shù)據(jù)庫設(shè)計(jì)、模塊詳細(xì)設(shè)計(jì)作了詳細(xì)的描述。最后剖析了部分代碼。</p><p>  

21、第三章對(duì)完成的系統(tǒng)進(jìn)行演示。</p><p>  最后對(duì)本論文進(jìn)行小結(jié),主要描述了在做本系統(tǒng)的過程中遇到的問題及解決方法以及在本系統(tǒng)中我學(xué)到了一些知識(shí),以及對(duì)給與我?guī)椭娜吮硎局轮x。</p><p><b>  2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</b></p><p><b>  2.1 需求分析</b></p><

22、p>  2.1.1 功能需求</p><p>  一般博客的功能包括:</p><p>  所有人能瀏覽博客的內(nèi)容(文章、相片、視頻等);</p><p>  所有人可以留言,留言可以是針對(duì)文章的評(píng)論,也可以是給博主的留言;</p><p>  博主可以登錄,他人無法登錄;</p><p>  博主登錄后可以發(fā)表

23、、刪除、更新文章、相片、視頻等內(nèi)容。他人無法對(duì)博客內(nèi)容操作;</p><p>  博主可以對(duì)所有人的留言進(jìn)行管理(刪除)操作,也可以回復(fù)留言者。</p><p>  2.1.2 項(xiàng)目計(jì)劃安排</p><p>  項(xiàng)目整體的開發(fā)計(jì)劃如圖2-1,此圖是用Visio 2007生成的,主要描述了項(xiàng)目的整體的安排和各個(gè)部分在整個(gè)項(xiàng)目開發(fā)周期中所占的時(shí)間比重。</p>

24、;<p>  圖2-1項(xiàng)目安排計(jì)劃</p><p>  2.2 系統(tǒng)開發(fā)環(huán)境</p><p>  2.2.1開發(fā)環(huán)境簡介 </p><p><b>  硬件配置:</b></p><p>  機(jī)器:Thinkpad</p><p>  CPU: Core 2 T5670 1.8GHz

25、</p><p>  內(nèi)存:DDR2 3G</p><p><b>  硬盤:160G</b></p><p>  操作系統(tǒng):Microsoft Windows Server 2008 Datacenter 64bit (en-us)</p><p>  開發(fā)工具:Visual Studio 2008 Team Syst

26、em、SQL Server 2005 Express</p><p>  工具插件:Silverlight、jQuery</p><p>  2.2.2 Visual Studio 2008開發(fā)環(huán)境簡介</p><p>  Visual Studio 2008是微軟公司推出目前最流行的Windows平臺(tái)應(yīng)用程序開發(fā)環(huán)境。Visual Studio 2008 在三個(gè)方

27、面為開發(fā)人員提供了關(guān)鍵改進(jìn):快速的應(yīng)用程序開發(fā)、高效的團(tuán)隊(duì)協(xié)作和突破性的用戶體驗(yàn)。Visual Studio 2008可以用來創(chuàng)建 Windows 平臺(tái)下的 Windows 應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序,也可以用來創(chuàng)建網(wǎng)絡(luò)服務(wù)、智能設(shè)備應(yīng)用程序和 Office 插件。</p><p>  2.2.3 SQL Server 2005數(shù)據(jù)庫簡介</p><p>  SQL Server 2005 是

28、一個(gè)全面的數(shù)據(jù)庫平臺(tái),使用集成的商業(yè)智能 (BI) 工具提供了企業(yè)級(jí)的數(shù)據(jù)管理。SQL Server 2005 數(shù)據(jù)庫引擎為關(guān)系型數(shù)據(jù)和結(jié)構(gòu)化數(shù)據(jù)提供了更安全可靠的存儲(chǔ)功能,可以構(gòu)建和管理用于業(yè)務(wù)的高可用和高性能的數(shù)據(jù)應(yīng)用程序。</p><p>  SQL Server 2005已經(jīng)與Visual Studio 和.NET Framework進(jìn)行了集成。據(jù)微軟官方顯示,利用SQL Server 2005 和 Vi

29、sual Studio進(jìn)行開發(fā),開發(fā)速度提高了40%以上,在很多場景中,能減少50%-70%代碼量。</p><p>  考慮到SQL Server 2005與.NET平臺(tái)的集成性和便利性,同時(shí)也考慮到技術(shù)之間的銜接、系統(tǒng)的性能和運(yùn)行的穩(wěn)定性,所以本系統(tǒng)使用的是SQL Server 2005 Express數(shù)據(jù)庫。</p><p><b>  2.3相關(guān)技術(shù)簡介</b>

30、;</p><p>  2.3.1 C#語言簡介</p><p>  C#語言是一門簡單、現(xiàn)代、優(yōu)雅、面向?qū)ο?、類型安全、平臺(tái)獨(dú)立的一門新型組件編程語言。經(jīng)過編譯,C#編寫的源代碼被編譯為一種符合CLI規(guī)范的中間語言(IL),通常是具有擴(kuò)展名為.exe和.dll的文件。運(yùn)行時(shí),由CLR加載IL元數(shù)據(jù)和引用的資源,然后轉(zhuǎn)換成機(jī)器語言再執(zhí)行。本系統(tǒng)采用C#語言來開發(fā)各個(gè)組件、功能模塊。<

31、/p><p>  2.3.2 ASP.NET 簡介</p><p>  ASP.NET 是一個(gè)統(tǒng)一的 Web 開發(fā)模型,作為 .NET Framework 的一部分提供。當(dāng)在編寫 ASP.NET 應(yīng)用程序的代碼時(shí),可以訪問.NET Framework 中的類。</p><p>  ASP.NET 中有一個(gè)重要功能,可以通過與客戶端應(yīng)用程序中類似的、基于事件的模型來對(duì)網(wǎng)頁

32、進(jìn)行編程。與傳統(tǒng) HTML 頁或基于客戶端的 Web 應(yīng)用程序中的事件相比,由 ASP.NET 服務(wù)器控件引發(fā)的事件的工作方式稍有不同。導(dǎo)致差異的主要原因在于事件本身與處理該事件的位置的分離。在基于客戶端的應(yīng)用程序中,在客戶端引發(fā)和處理事件。但是,在 ASP.NET 網(wǎng)頁中,與服務(wù)器控件關(guān)聯(lián)的事件在客戶端(瀏覽器)上引發(fā),但由 ASP.NET 頁在 Web 服務(wù)器上處理。</p><p>  對(duì)于在客戶端引發(fā)的事

33、件,ASP.NET Web 控件事件模型要求在客戶端捕獲事件信息,并通過 HTTP POST 將事件消息傳輸?shù)椒?wù)器。頁必須解釋該 POST 以確定所發(fā)生的事件,然后在要處理該事件的服務(wù)器上調(diào)用代碼中的相應(yīng)方法。</p><p>  本系統(tǒng)中在UI層的表示層邏輯就是基于ASP.NET的Web事件模型進(jìn)行編程的。利用這種編程模型既可以簡化Web應(yīng)用程序的開發(fā)又可以實(shí)現(xiàn)出功能非常強(qiáng)大系統(tǒng)。</p>&l

34、t;p>  2.3.3 ADO.NET 簡介</p><p>  Microsoft在開始設(shè)計(jì).NET 框架時(shí)設(shè)計(jì)了一個(gè)新的數(shù)據(jù)訪問框架ADO.NET。ADO.NET具有如下優(yōu)點(diǎn):提供了斷開的數(shù)據(jù)訪問模型;提供了與 XML 的緊密集成;提供了與 .NET 框架的無縫集成(例如,兼容基類庫類型系統(tǒng))。</p><p>  ADO.NET提供兩種訪問模式:斷開連接模式和連接模式。使用斷開

35、連接模式一般利用DataAdapter從數(shù)據(jù)源檢索數(shù)據(jù)并填充 DataSet 中的表,同時(shí)還可將對(duì) DataSet 所做的更改解析回?cái)?shù)據(jù)源。而使用連接模式是利用ADO.NET DataReader 從數(shù)據(jù)庫中檢索只讀、只進(jìn)的數(shù)據(jù)流。查詢結(jié)果在查詢執(zhí)行時(shí)返回,在并存儲(chǔ)在客戶端的網(wǎng)絡(luò)緩沖區(qū)中,直到程序使用 DataReader 的 Read 方法對(duì)它們發(fā)出請(qǐng)求。使用 DataReader 可以提高應(yīng)用程序的性能,原因是它只要數(shù)據(jù)可用就立即檢

36、索數(shù)據(jù),并且(默認(rèn)情況下)一次只在內(nèi)存中存儲(chǔ)一行,減少了系統(tǒng)開銷。</p><p>  創(chuàng)建一個(gè)DataSet對(duì)象的系統(tǒng)開銷是比較大的。如果大范圍的使用DataSet,對(duì)系統(tǒng)的壓力會(huì)增大很多。DataSet本身是弱類型的,在業(yè)務(wù)邏輯處理層進(jìn)行操作時(shí)會(huì)存在類型安全的隱患,并且在編碼時(shí)也不能提供代碼提示的便捷性。雖然可以構(gòu)建強(qiáng)類型的DataSet,但是會(huì)增加大量的代碼。另外如果深度使用DataSet,比如用到Data

37、Relation等,又會(huì)牽扯到與數(shù)據(jù)庫的同步問題,及數(shù)據(jù)庫關(guān)于加鎖機(jī)制的問題。這樣會(huì)增大技術(shù)復(fù)雜度,這是沒有必要的。在本系統(tǒng)中使用是連接方式來讀取數(shù)據(jù),同時(shí)使用泛型List來承載數(shù)據(jù),每讀一條數(shù)據(jù)就存儲(chǔ)到泛型List中去,泛型List相對(duì)于弱類型的DataSet省去了不必要的裝箱和拆箱操作,大大提高了性能。</p><p>  2.3.4 Silverlight技術(shù)簡介</p><p> 

38、 Microsoft Silverlight 是一種跨瀏覽器、跨平臺(tái)的用于為 Web 生成和提供下一代媒體體驗(yàn)和豐富的交互式應(yīng)用程序 (RIA)。Silverlight 統(tǒng)一了服務(wù)器、Web 和桌面的功能,統(tǒng)一了托管代碼和動(dòng)態(tài)語言、聲明性編程和傳統(tǒng)編程以及 Windows Presentation Foundation (WPF) 的功能??梢圆捎肅# 和 VB.NET編程語言來編寫托管代碼,并可以全面使用.NET框架庫。技術(shù)細(xì)節(jié)請(qǐng)參見

39、Silverlight SDK或者M(jìn)SDN等資料,本系統(tǒng)涉及到的詳細(xì)代碼請(qǐng)參見3.2.8節(jié)。</p><p>  由于在開發(fā)上有.NET強(qiáng)大類庫的支撐,同時(shí)在IDE上又有Visual Studio 2008、Blend2這樣的工具,與服務(wù)器通信又有WCF這樣的技術(shù)做鋪墊。所以本人選擇Silverlight作為這個(gè)畢業(yè)設(shè)計(jì)的前端展示技術(shù)。</p><p>  2.3.5 WCF簡介</

40、p><p>  Windows通信基礎(chǔ)(Windows Communication Foundation,WCF)是微軟分布式應(yīng)用程序開發(fā)的集大成者,它整合了.Net平臺(tái)下所有的和分布式系統(tǒng)有關(guān)的技術(shù),例如.Net Remoting、ASMX、WSE和MSMQ。以通信(Communiation)范圍而論,它可以跨進(jìn)程、跨機(jī)器、跨子網(wǎng)、企業(yè)網(wǎng)乃至于 Internet;以宿主程序而論,可以以ASP.NET,EXE,WPF

41、,Windows Forms,NT Service,COM+作為宿主(Host)。WCF可以支持的協(xié)議包括TCP,HTTP,跨進(jìn)程以及自定義,安全模式則包括SAML, Kerberos,X509,用戶/密碼,自定義等多種標(biāo)準(zhǔn)與模式。也就是說,在WCF框架下,開發(fā)基于SOA的分布式系統(tǒng)將變得非常容易。</p><p>  本系統(tǒng)也涉及部分WCF技術(shù),主要用在Silverlight與后臺(tái)數(shù)據(jù)的交互上。 Silverl

42、ight僅僅支持的一種綁定,那就是BasicHttpBinding協(xié)議,而這正是WCF所支持的一種基本協(xié)議。這樣WCF與Silverlight兩種技術(shù)之間有了更好的銜接,同時(shí)這給我在系統(tǒng)的開發(fā)中提供了很好的便利性。</p><p>  詳細(xì)的代碼請(qǐng)參見源碼部分。</p><p>  2.3.6 jQuery庫簡介</p><p>  jQuery由美國人John R

43、esig創(chuàng)建。jQuery是繼prototype之后又一個(gè)優(yōu)秀的JavaScript框架。它是輕量級(jí)的js庫(壓縮后只有21k),這是其它的JavaScript庫所不及的,它兼容CSS3,還兼容各種瀏覽器。jQuery是一個(gè)快速的,簡潔的JavaScript庫,使用戶能更方便地處理HTML documents、events、實(shí)現(xiàn)動(dòng)畫效果,并且方便地為網(wǎng)站提供AJAX交互。</p><p>  jquery的簡單的

44、實(shí)用的確有相當(dāng)大的吸引力。本系統(tǒng)在UI層就應(yīng)用了jQuery庫,用來展現(xiàn)一些界面特效。詳細(xì)的代碼請(qǐng)參見源碼部分。</p><p>  2.4系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p>  2.4.1 分層架構(gòu)核心思想</p><p>  1、針對(duì)接口編程,而不針對(duì)實(shí)現(xiàn)編程</p><p>  針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程--這是面向?qū)ο笤O(shè)計(jì)中最重要的

45、原則之一這里所指的接口,不是特指編程語言中的具體語言元素(如C#中由Interface定義的語言接口),而是只一種抽象的,在語義層面上起著接合作用語義體。它的具體實(shí)現(xiàn),可能是接口,可能是抽象類,甚至可能是具體類。一般接口可以理解為以下兩點(diǎn):</p><p>  接口是一組規(guī)則的集合,它規(guī)定了實(shí)現(xiàn)本接口的類或接口必須擁有的一組規(guī)則。體現(xiàn)了自然界“如果你是……則必須能……”的理念。</p><p&

46、gt;  接口是在一定粒度視圖上同類事物的抽象表示。</p><p>  具體到N層架構(gòu)中,針對(duì)接口編程的意義是這樣的:現(xiàn)約定將N層架構(gòu)的各層依次編號(hào)為1、2、…、K、…、N-1、N,其中層的編號(hào)越大,則越處在上層,那么第 K 層不應(yīng)該依賴具體一個(gè) K-1 層,而應(yīng)該依賴一個(gè) K-1 層的接口,即在第 K 層中不應(yīng)該有 K-1 層中的某個(gè)具體類。</p><p><b>  2、

47、依賴倒置原則</b></p><p>  在軟件設(shè)計(jì)原則中,有一種重要的思想叫做依賴倒置。它的核心思想是:不能讓高層組件依賴底層組件,而且,不管高層組件和底層組件,兩者都應(yīng)依賴于抽象。所謂的依賴倒置原則,其實(shí)就是上面提到針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程,兩者在本質(zhì)上是統(tǒng)一的。 </p><p>  綜上所述,本系統(tǒng)應(yīng)該是這樣一種架構(gòu): </p><p>

48、  N層架構(gòu)的各層依次編號(hào)為 1、2、…、K、…、N-1、N,其中層的編號(hào)越大,則越處在上層。 </p><p>  架構(gòu)中僅存在一種依賴,即第 K 層接口依賴第 K-1 層,其中 1<K<=N。</p><p><b>  3、封裝變化</b></p><p>  封裝變化的原則定義為:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,

49、不要和那些不需要變化的代碼混雜在一起。</p><p><b>  4、開放、關(guān)閉原則</b></p><p>  開發(fā)-關(guān)閉原則定義為:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。</p><p><b>  5、單一職責(zé)原則</b></p><p>  任何一個(gè)類都應(yīng)該有單一的職責(zé),屬于單獨(dú)的一層,而不能同時(shí)擔(dān)負(fù)兩

50、種職責(zé)或?qū)儆诙喔鲗印?lt;/p><p>  三層架構(gòu)是一種比較成熟的系統(tǒng)架構(gòu),通過將整個(gè)系統(tǒng)分為不同的邏輯塊,大大降低了應(yīng)用系統(tǒng)開發(fā)和維護(hù)的成本。三層架構(gòu)將數(shù)據(jù)訪問和邏輯操作都集中到組件中,增強(qiáng)了系統(tǒng)的復(fù)用性。同時(shí)也使系統(tǒng)的擴(kuò)展性大大增強(qiáng)。模塊化使得系統(tǒng)很容易在縱向和水平兩個(gè)方向拓展:一方面可以將系統(tǒng)升級(jí)為更大、更有力的平臺(tái),另一方面也可以適當(dāng)增加規(guī)模來增強(qiáng)系統(tǒng)的網(wǎng)絡(luò)應(yīng)用。</p><p>

51、  從開發(fā)角度和應(yīng)用角度來看,三層架構(gòu)比雙層或單層結(jié)構(gòu)都有更大的優(yōu)勢(shì)。三層結(jié)構(gòu)適合群體開發(fā),每人可以有不同的分工,協(xié)同工作使效率倍增。開發(fā)雙層或單層應(yīng)用時(shí),每個(gè)開發(fā)人員都應(yīng)對(duì)系統(tǒng)有較深的理解,能力要求很高,開發(fā)三層應(yīng)用時(shí),則可以結(jié)合多方面的人才,只需少數(shù)人對(duì)系統(tǒng)全面了解,從一定程度工降低了開發(fā)的難度。</p><p>  基于以上優(yōu)點(diǎn)本系統(tǒng)采用三層架構(gòu)來開發(fā)。</p><p>  2.4.

52、2 實(shí)體介紹</p><p>  根據(jù)對(duì)本博客系統(tǒng)的簡要需求分析,可以確定以下幾個(gè)實(shí)體:</p><p>  用戶信息:代表用戶,包括了用戶的登錄名、密碼、個(gè)性設(shè)置等。</p><p>  博客留言:代表一些人對(duì)博客的評(píng)價(jià)等信息。</p><p>  博客信息:包含了博客的基本信息,如博客名稱、訪問人數(shù)、主題等。</p><

53、;p>  文章:就是文章實(shí)體,包含文章的基本信息,如標(biāo)題、內(nèi)容、發(fā)布時(shí)間等。</p><p>  文章分類:就是文章的類別。</p><p>  文章評(píng)論:代表了對(duì)于莫一篇文章發(fā)表的評(píng)論。</p><p>  照片:代表照片基本信息。</p><p>  照片分類:代表照片的分類。</p><p>  2.4.3

54、 數(shù)據(jù)庫設(shè)計(jì)</p><p><b>  圖2-2數(shù)據(jù)庫表</b></p><p>  整個(gè)系統(tǒng)涉及的數(shù)據(jù)庫的表有8張,各個(gè)表之間的關(guān)系如圖2-2。以下是各個(gè)表的簡要說明:</p><p>  UserInfo:用戶表。主要保存了博主的相關(guān)信息。</p><p>  Leavewords:留言表。主要保存訪問者對(duì)整個(gè)Bl

55、og的評(píng)論。</p><p>  BlogInfo:博客表。主要存放Blog的基本設(shè)置信息。</p><p>  PhotoCategory:圖片分類表。主要存放圖片的分類信息。</p><p>  Photo:圖片表。主要存放圖片信息。</p><p>  PostCategory:文章分類表。文章分類信息。</p><

56、p>  Post:文章表。文章的基本信息。</p><p>  Comment: 文章評(píng)論表。文章的相關(guān)評(píng)論信息。</p><p>  圖2-3完整顯示了整個(gè)系統(tǒng)設(shè)計(jì)到的表。</p><p><b>  圖2-3數(shù)據(jù)庫表</b></p><p>  存儲(chǔ)過程是 SQL 語句和可選控制流語句的預(yù)編譯集合,以一個(gè)名稱存

57、儲(chǔ)并作為一個(gè)單元處理。存儲(chǔ)過程存儲(chǔ)在數(shù)據(jù)庫內(nèi),可由應(yīng)用程序通過一個(gè)調(diào)用執(zhí)行,而且允許聲明變量、有條件執(zhí)行以及其它強(qiáng)大的編程功能。存儲(chǔ)過程在創(chuàng)建時(shí)即在服務(wù)器上進(jìn)行編譯,所以執(zhí)行起來比單個(gè) SQL 語句快。由于存儲(chǔ)過程在性能上和功能上相對(duì)于單個(gè)SQL語句有較大的優(yōu)勢(shì),所以在系統(tǒng)中采用存儲(chǔ)過程。圖2-4展示了系統(tǒng)所用到的存儲(chǔ)過程。</p><p><b>  圖2-4 存儲(chǔ)過程</b></p

58、><p>  2.4.4 實(shí)體類的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  實(shí)體類是對(duì)實(shí)體的封裝,它通常包括私有變量及對(duì)應(yīng)的 get、set 方法,而在 C#語言中,將 get、set 方法又組合成屬性。這些私有變量或者屬性,則對(duì)應(yīng)現(xiàn)實(shí)實(shí)體相應(yīng)的屬性。實(shí)體類的作用主要有兩個(gè),一是作為現(xiàn)實(shí)實(shí)體的計(jì)算機(jī)代表,二是數(shù)據(jù)的傳遞。在分層架構(gòu)的應(yīng)用中,數(shù)據(jù)正是封裝在實(shí)體類中,然后以實(shí)體類為載體在各個(gè)層次間傳遞。這樣

59、不但符合面向?qū)ο笤O(shè)計(jì)的原則,也便于對(duì)數(shù)據(jù)存取進(jìn)行控制。理想情況下,實(shí)體類中不能含有任何邏輯,它應(yīng)該單純是數(shù)據(jù)的封裝。所以,它不應(yīng)該有方法,當(dāng)然構(gòu)造函數(shù)除外?;谝陨戏治?,我們?cè)O(shè)計(jì)的實(shí)體類,應(yīng)該是準(zhǔn)確、干凈、易用。準(zhǔn)確表明實(shí)體類應(yīng)該準(zhǔn)確無誤地表示現(xiàn)實(shí)中的實(shí)體,干凈表示實(shí)體類應(yīng)該僅包含數(shù)據(jù)的封裝而不摻雜任何邏輯或者與數(shù)據(jù)封裝無關(guān)的東西,易用表示實(shí)體類應(yīng)該很容易地用來在各層之間傳遞數(shù)據(jù)。</p><p>  本系統(tǒng)不需

60、考慮特殊實(shí)體類的情況,僅需編寫簡單的實(shí)體類即可。詳細(xì)信息請(qǐng)參見相關(guān)代碼。完整的類庫如圖2-5所示。</p><p><b>  圖2-5 實(shí)體類庫</b></p><p>  2.4.5 接口設(shè)計(jì)</p><p>  接口有以下幾個(gè)作用: </p><p>  接口明確了各層次的職責(zé)。 </p><p

61、>  接口決定了各個(gè)層次具體需要實(shí)現(xiàn)的功能。 </p><p>  接口形成了整個(gè)分層架構(gòu)的骨架。</p><p>  接口暴露了層次的 API,為上層提供了依賴點(diǎn)。 </p><p>  因此,接口的設(shè)計(jì)實(shí)際上處在現(xiàn)實(shí)需求和程序?qū)崿F(xiàn)之間,起到承上啟下的用。它決定了需求分析中的各個(gè)需求如何合理地映射成各個(gè)層次的不同方法。所以接口的設(shè)計(jì)應(yīng)該在需求分析的基礎(chǔ)上進(jìn)行

62、。</p><p>  本系統(tǒng)中主要需要設(shè)計(jì)的接口有:數(shù)據(jù)訪問層接口、業(yè)務(wù)邏輯層接口。</p><p><b>  數(shù)據(jù)訪問層接口</b></p><p>  數(shù)據(jù)訪問層負(fù)責(zé)與數(shù)據(jù)源的交互,負(fù)責(zé)數(shù)據(jù)的創(chuàng)建、刪除、更新及查詢工作。它不應(yīng)該包含任何業(yè)務(wù)邏輯或可視性元素,對(duì)它所處理數(shù)據(jù)的業(yè)務(wù)意義是“無知”的。它與數(shù)據(jù)庫系統(tǒng)一起負(fù)責(zé)數(shù)據(jù)完整性。在三層模

63、型中,數(shù)據(jù)訪問層為上層(業(yè)務(wù)邏輯層)提供了服務(wù),數(shù)據(jù)訪問層的接口規(guī)定了數(shù)據(jù)訪問層的功能,業(yè)務(wù)邏輯層針對(duì)接口進(jìn)行編程,不管數(shù)據(jù)訪問層如何變化,只要接口不變,業(yè)務(wù)邏輯層都不需要變動(dòng)。這樣在開發(fā)系統(tǒng)中將可變因素減少到最少,這也就是分層架構(gòu)的最基本的思想:針對(duì)接口編程,而不針對(duì)實(shí)現(xiàn)編程。以下列出本系統(tǒng)中完整的類庫,如圖2-6所示。</p><p>  圖2-6 數(shù)據(jù)訪問層接口</p><p>&l

64、t;b>  業(yè)務(wù)邏輯層接口</b></p><p>  在設(shè)計(jì)業(yè)務(wù)邏輯層接口之前,需要對(duì)業(yè)務(wù)邏輯層的職責(zé)進(jìn)行明確。業(yè)務(wù)邏輯層的職責(zé)敘述如下:業(yè)務(wù)邏輯層負(fù)責(zé)完成與系統(tǒng)領(lǐng)域相關(guān)的業(yè)務(wù)邏輯操作,實(shí)現(xiàn)過程中的數(shù)據(jù)訪問操作通過調(diào)用數(shù)據(jù)訪問層實(shí)現(xiàn)。它對(duì)業(yè)務(wù)相關(guān)的數(shù)據(jù)有效性負(fù)責(zé),但是不負(fù)責(zé) UI 輸入數(shù)據(jù)的有效性。業(yè)務(wù)邏輯層中不能含有與顯示相關(guān)的邏輯,不能決定或影響數(shù)據(jù)最終的呈現(xiàn)樣式。 由于不同領(lǐng)域的業(yè)務(wù)邏輯

65、差別很大,所以無法像數(shù)據(jù)訪問層那樣對(duì)接口操作做出明確的分類。在實(shí)際項(xiàng)目開發(fā)中,業(yè)務(wù)邏輯層接口的設(shè)計(jì)往往要和領(lǐng)域?qū)<液献?。而在本博客系統(tǒng)中,由于業(yè)務(wù)邏輯都是比較簡單的,所以不用進(jìn)行專門的領(lǐng)域邏輯調(diào)研。完整的類庫如圖2-7所示。</p><p>  圖2-7 業(yè)務(wù)邏輯層接口</p><p>  2.4.6 IoC 容器及依賴注入機(jī)制的設(shè)計(jì)</p><p>  1、IoC

66、 容器及依賴注入機(jī)制的設(shè)計(jì)</p><p>  依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(調(diào)用者)需要另一個(gè)角色(被調(diào)用者)的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。但在具有依賴注入的系統(tǒng)里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者實(shí)例的工作通常由 Ioc 容

67、器來完成,然后注入調(diào)用者,因此也稱為依賴注入。 具體到分層架構(gòu)中,依賴注入可以這樣理解:當(dāng)上層類的需要調(diào)用下層類功能時(shí),不再是由上層類直接實(shí)例化下層類,而是通過 IoC 容器獲取一個(gè)下層類的實(shí)例,然后注入到上層類中。 </p><p>  IoC 容器負(fù)責(zé)根據(jù)配置信息,創(chuàng)建不同的數(shù)據(jù)訪問層及業(yè)務(wù)邏輯層實(shí)例,并將其注入到業(yè)務(wù)邏輯層與表示層中,從而實(shí)現(xiàn)三個(gè)層次的解耦。</p><p>  依賴

68、注入機(jī)制的實(shí)現(xiàn)有兩種途徑,一種是使用現(xiàn)有的框架。如 J2EE 平臺(tái)上的 Spring 框架就可以很好的完成依賴注入功能,在.NET 平臺(tái)上有 Spring.NET等框架可以選擇。另一種途徑,就是自己編寫相應(yīng)的代碼,完成依賴注入機(jī)制。 </p><p>  鑒于.NET 平臺(tái)上的“反射”機(jī)制對(duì)依賴注入的實(shí)現(xiàn)非常方便,所以本系統(tǒng)將采用第二種方案,使用 Abstract Factory 設(shè)計(jì)模式和反射機(jī)制完成依賴注入的

69、設(shè)計(jì)。</p><p>  2、Abstract Factory模式的應(yīng)用</p><p>  Abstract Factory模式是在依賴注入機(jī)制中廣泛采用的設(shè)計(jì)模式, Spring的IoC容器就采用了這個(gè)經(jīng)典模式。它的中文譯名叫做“抽象工廠”,其定義是這樣的:提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要指定具體類。</p><p>  以數(shù)據(jù)訪問層注入到

70、業(yè)務(wù)邏輯層為例(業(yè)務(wù)邏輯層注入到表示層的原理類似) ,先假設(shè)該博客系統(tǒng)中僅有用戶和文章兩個(gè)實(shí)體,并且我們的系統(tǒng)需要能訪問 SQLServer 和 Oracle 兩個(gè)數(shù)據(jù)庫,那么,系統(tǒng)中就需要 SQLServerDAL 和 OracleDAL 兩個(gè)數(shù)據(jù)訪問層,它們都含有兩個(gè)數(shù)據(jù)訪問類,分別是 SQLServerUserDAL、SQLServerPostDAL和 OracleUserDAL、OraclePostDAL。此時(shí),用戶和帖子的業(yè)務(wù)

71、邏輯層類UserBLL與 PostBLL 作為客戶類,不應(yīng)該與具體的數(shù)據(jù)訪問層類耦合,而應(yīng)該先定義接口 IUserDAL 與 IPostDAL 接口,讓業(yè)務(wù)邏輯層與這兩個(gè)接口耦合。再設(shè)計(jì)SQLServerDALFactory與 OracleDALFactory,分別作為生成兩種數(shù)據(jù)訪問層的工廠,最后通過配置信息,決定在業(yè)務(wù)邏輯層中實(shí)例化哪個(gè)工廠。如圖2-8所示。</p><p>  圖2-8 Ioc容器注入原理&

72、lt;/p><p>  Abstract Factory模式雖然可以完成依賴注入的機(jī)制的設(shè)計(jì),但是其本身也有缺陷。從上文可以看出,就數(shù)據(jù)訪問層而言,每個(gè)數(shù)據(jù)訪問層實(shí)現(xiàn)都要對(duì)應(yīng)一個(gè)工廠,業(yè)務(wù)邏輯層當(dāng)然也是如此。并且以后每當(dāng)添加一個(gè)新的實(shí)現(xiàn),都要寫一個(gè)相應(yīng)的工廠。因此,當(dāng)層次的實(shí)現(xiàn)過多時(shí),整個(gè)系統(tǒng)就會(huì)存在很多工廠,這些工廠不僅使代碼變得臃腫,也難以維護(hù)。 </p><p>  .NET平臺(tái)上,有一

73、種叫“反射”的機(jī)制,利用這種機(jī)制,可以簡化Abstract Factory設(shè)計(jì)模式的代碼。而利用反射機(jī)制簡化后的 Abstract Factory 則可以叫做Reflection Abstract Factory,也叫反射工廠。 </p><p>  反射就是動(dòng)態(tài)發(fā)現(xiàn)類型信息的能力。它幫助程序設(shè)計(jì)人員在程序運(yùn)行時(shí)利用一些信息去動(dòng)態(tài)地使用類型,這些信息在設(shè)計(jì)時(shí)是未知的,這種能力可以用于后期綁定。反射還支持的更高級(jí)的

74、行為,能在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建新類型,并且對(duì)這些新類型的操作進(jìn)行調(diào)用。 </p><p>  有了反射機(jī)制,我們就可以從配置文件(一般是在 Web.config)讀出配置信息后,不是根據(jù)這個(gè)信息實(shí)例化相應(yīng)的工廠,而是讓反射工廠通過這些信息,動(dòng)態(tài)加載相應(yīng)程序集中的類,這樣每個(gè)層次只需要一個(gè)工廠就可以完成依賴注入,即使以后出現(xiàn)新的實(shí)現(xiàn),也不需要修改或添加工廠,只要在配置文件中寫明程序集的名字即可。如果考慮到性能和易用性,可

75、以配合緩存機(jī)制和 Facade 設(shè)計(jì)模式進(jìn)一步優(yōu)化 IoC 的設(shè)計(jì)。最終反射工廠結(jié)構(gòu)圖如圖2-9所示。</p><p>  圖2-9 反射工廠結(jié)構(gòu)圖</p><p>  圖2-10 反射工廠示意圖</p><p>  在圖2-10中DALFactory 和 BLLFactory 的實(shí)例化箭頭直接指向了 IDAL 和IBLL。實(shí)際上,IDAL 和 IBLL 分別是一個(gè)

76、工程,它里面是一組接口,這里不是指工廠直接實(shí)例化接口(實(shí)際上接口也是不可能被實(shí)例化的)。 </p><p>  使用反射機(jī)制后,同一層次的不同實(shí)現(xiàn)分別放在不同工程下,而里面包含的各個(gè)類的名字是一致的。例如 SQLServerDAL 下和 OracleDAL 下都有UserInfoDAL,至于運(yùn)行時(shí)具體實(shí)例化哪個(gè),是通過 Web.config 中配置實(shí)現(xiàn)的。也就是說Web.config 決定了實(shí)例化哪個(gè)工程下的Us

77、erInfoDAL。</p><p>  2.4.7 數(shù)據(jù)訪問層的實(shí)現(xiàn)</p><p>  數(shù)據(jù)訪問層的實(shí)現(xiàn)一般有兩種方式:基于樸素的實(shí)現(xiàn)和基于ORM框架的實(shí)現(xiàn)。對(duì)于ORM由于篇幅原因不做過多描述。本系統(tǒng)采用數(shù)據(jù)訪問層的樸素實(shí)現(xiàn),就是指傳統(tǒng)的通過執(zhí)行 SQL 語句或調(diào)用存儲(chǔ)過程實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作。.NET 平臺(tái)內(nèi)置了豐富的對(duì)數(shù)據(jù)庫進(jìn)行操作的類庫,因此數(shù)據(jù)訪問層的樸素實(shí)現(xiàn)非常方便。 <

78、/p><p>  具體到本課題中,數(shù)據(jù)訪問層的樸素實(shí)現(xiàn)操作一般分為以下兩種方式。 </p><p>  使用動(dòng)態(tài) SQL 語句: </p><p><b>  獲取參數(shù)。 </b></p><p>  動(dòng)態(tài)組合 SQL 語句。 </p><p>  執(zhí)行 SQL 語句。 </p><

79、;p><b>  返回結(jié)果。 </b></p><p><b>  使用存儲(chǔ)過程: </b></p><p><b>  獲取參數(shù)。 </b></p><p>  生成存儲(chǔ)過程可用參數(shù)形式。 </p><p><b>  調(diào)用存儲(chǔ)過程。 </b>&l

80、t;/p><p><b>  返回結(jié)果。 </b></p><p>  存儲(chǔ)過程相對(duì)于動(dòng)態(tài)SQL語句有一定的優(yōu)越性。在本系統(tǒng)中都將采用存儲(chǔ)過程。在系統(tǒng)中由于每次執(zhí)行存儲(chǔ)過程時(shí),都需要一系列類似的操作,因此我在系統(tǒng)中對(duì)這個(gè)模塊進(jìn)行了一次封裝,這樣可以大大減少重復(fù)性代碼。在本系統(tǒng)的實(shí)現(xiàn)中,將各種封裝對(duì)數(shù)據(jù)庫操作的輔助類叫做 DALHelper 類,如對(duì) SQLServer 數(shù)

81、據(jù)庫進(jìn)行操作的輔助類就叫做 SQLServerHelper,它包含了四個(gè)方法:ExecuteSQLNonQurey、ExecuteSQLReader、ExecuteProcedureNonQurey、ExecuteProcedureReader,分別用于執(zhí)行存儲(chǔ)過程返回不同的結(jié)果。這樣,在 SQLServer 數(shù)據(jù)訪問層中,就可以直接調(diào)用這些方法完成操作。樸素實(shí)現(xiàn)的示意圖如圖2-11所示。</p><p>  圖

82、2-11 數(shù)據(jù)庫訪問層的樸素實(shí)現(xiàn)</p><p>  本系統(tǒng)的數(shù)據(jù)訪問模塊工程如圖2-12所示。</p><p>  圖2-12 數(shù)據(jù)訪問模塊</p><p>  DAL:類庫。實(shí)現(xiàn)IDAL接口,主要包含各個(gè)實(shí)體所具有的操作。文件列表如圖2-11。</p><p>  Factory:類庫。產(chǎn)生DAL或者BLL的實(shí)現(xiàn)。</p>

83、<p>  代碼分析一:(CacheAccess.cs)</p><p><b>  /*</b></p><p>  * Create Time: 2008-12-25</p><p>  * Editor: Zhou Hui</p><p><b>  */</b></p>

84、<p>  using System;</p><p>  using System.Collections.Generic;</p><p>  using System.Linq;</p><p>  using System.Text;</p><p>  using System.Web.Caching;</p&g

85、t;<p>  using System.Web;</p><p>  namespace BlogSys.NLBlog.Data.Factory</p><p><b>  {</b></p><p>  /// <summary></p><p>  /// Control the cach

86、e class.</p><p>  /// </summary></p><p>  public sealed class CacheAccess</p><p><b>  {</b></p><p>  /// <summary></p><p>  /// Get

87、 object from cache</p><p>  /// </summary></p><p>  /// <param name="key">Cache key</param></p><p>  /// <returns>The object get from cache</ret

88、urns></p><p>  public static object GetFromCache(string key)</p><p><b>  {</b></p><p>  Cache cache = HttpRuntime.Cache;</p><p>  return cache[key];</

89、p><p><b>  }</b></p><p>  /// <summary></p><p>  /// Save the object value to the cache</p><p>  /// </summary></p><p>  /// <param

90、 name="key">Cache key</param></p><p>  /// <param name="value">The object value</param></p><p>  /// <param name="cacheDependency">Cache

91、dependency</param></p><p>  public static void SaveToCache(string key, object value, </p><p>  CacheDependency cacheDependency)</p><p><b>  {</b></p><p&

92、gt;  Cache cache = HttpRuntime.Cache;</p><p>  cache.Insert(key, value, cacheDependency);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

93、}</b></p><p>  這個(gè)類主要包含兩個(gè)方法,GetFromCache和SaveToCache。顧名思義就是一個(gè)從緩存里取,一個(gè)是把對(duì)象往緩存里加。</p><p>  從緩存里取的時(shí)候可能是返回的NULL,表示這個(gè)對(duì)象之前并沒有被緩存,這個(gè)值在DependencyProvider.cs里面有判斷。另一個(gè)方法是把一個(gè)對(duì)象往緩存里面加,注意最后一個(gè)參數(shù)是一個(gè)緩存依賴,這

94、個(gè)參數(shù)是指如果這個(gè)依賴的文件(或者其他什么)一旦變化了,那么緩存里的東西就會(huì)銷毀。</p><p>  代碼分析二:(DependencyProvider.cs)</p><p><b>  /*</b></p><p>  * Create Time: 2008-12-25</p><p>  * Editor: Zh

95、ou Hui</p><p><b>  */</b></p><p>  using System.Web.Caching;</p><p>  using System.Web;</p><p>  using System.Configuration;</p><p>  using Sys

96、tem.Reflection;</p><p>  namespace BlogSys.NLBlog.Data.Factory</p><p><b>  {</b></p><p>  /// <summary></p><p>  /// Dependency injected provider</

97、p><p>  /// Using reflection mechanism</p><p>  /// </summary></p><p>  public sealed class DependencyProvider</p><p><b>  {</b></p><p>  //

98、/ <summary></p><p>  /// Get DAL object method.</p><p>  /// </summary></p><p>  /// <param name="className">The name of the DAL class</param></

99、p><p>  /// <returns>The object value</returns></p><p>  public static object GetDALObject(string className)</p><p><b>  {</b></p><p>  //Get DAL n

100、amespace from cache</p><p>  object dalObject = CacheAccess.GetFromCache("DAL");</p><p>  if (dalObject == null)</p><p><b>  {</b></p><p>  //DAL

101、namespace doesn't exist in the cache, </p><p>  //then insert new one into the cache</p><p>  CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("We

102、b.config"));</p><p>  dalObject = ConfigurationManager.AppSettings["DAL"].ToString();</p><p>  CacheAccess.SaveToCache("DAL", dalObject, fileDependency);</p><

103、p><b>  }</b></p><p>  //Convert object type to string type, then get the DAL namespace</p><p>  string dalName = dalObject.ToString();</p><p>  //Get the full DAL cla

104、ss name</p><p>  string fullDALClassName = dalName + "." + className;</p><p>  //Get DAL class from cache</p><p>  object fullDALObject = CacheAccess.GetFromCache(classNam

105、e);</p><p>  if (fullDALObject == null)</p><p><b>  {</b></p><p>  //DAL class name doesn't exist in the cache, </p><p>  //then insert new one into the

106、 cache</p><p>  CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.config"));</p><p>  fullDALObject = Assembly.Load(dalName).CreateInstance(f

107、ullDALClassName);</p><p>  CacheAccess.SaveToCache(className, fullDALObject, fileDependency);</p><p><b>  }</b></p><p>  return fullDALObject;</p><p><b&

108、gt;  }</b></p><p>  /// <summary></p><p>  /// Get BLL object method.</p><p>  /// </summary></p><p>  /// <param name="className">The

109、 name of the BLL class</param></p><p>  /// <returns>The object value</returns></p><p>  public static object GetBLLObject(string className)</p><p><b>  {<

110、;/b></p><p>  //Get BLL namespace from cache</p><p>  object bllObject = CacheAccess.GetFromCache("BLL");</p><p>  if (bllObject == null)</p><p><b> 

111、 {</b></p><p>  //BLL namespace doesn't exist in the cache, </p><p>  //then insert new one into the cache</p><p>  CacheDependency fileDependency = new CacheDependency(Ht

112、tpContext.Current.Server.MapPath("Web.config"));</p><p>  bllObject = ConfigurationManager.AppSettings["BLL"].ToString();</p><p>  CacheAccess.SaveToCache("BLL", bl

113、lObject, fileDependency);</p><p><b>  }</b></p><p>  //Convert object type to string type, then get the BLL namespace</p><p>  string bllName = bllObject.ToString();<

114、/p><p>  //Get the full BLL class name</p><p>  string fullBLLClassName = bllName + "." + className;</p><p>  //Get BLL class from cache</p><p>  object fullBLLO

115、bject = CacheAccess.GetFromCache(className);</p><p>  if (fullBLLObject == null)</p><p><b>  {</b></p><p>  //BLL class name doesn't exist in the cache, </p>

116、<p>  //then insert new one into the cahe</p><p>  CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.config"));</p><p>  fullBLLObject =

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論