

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)設計論文</b></p><p> 系部 軟件學院 </p><p> 專業(yè) 軟件技術/應用英語 </p><p> 題目 個人博客系統(tǒng)的設計與實現 </p>
2、<p> 指導教師 </p><p> 評閱教師 </p><p> 畢業(yè)設計(論文)中文摘要</p><p> 畢業(yè)設計(論文)外文摘要</p><p><b> 目
3、錄</b></p><p> 1 緒論- 1 -</p><p> 1.1 博客概況- 1 -</p><p> 1.1.1 博客的產生- 1 -</p><p> 1.1.2 博客的現狀- 2 -</p><p> 1.2 博客的發(fā)展、需求與前景- 2 -</p><
4、;p> 1.3 本論文任務概述- 2 -</p><p> 1.4 本論文章節(jié)安排- 3 -</p><p> 2 系統(tǒng)設計與實現- 3 -</p><p> 2.1 需求分析- 3 -</p><p> 2.1.1 功能需求- 3 -</p><p> 2.1.2 項目計劃安排- 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數據庫簡介- 5 -</p><p> 2.3相
6、關技術簡介- 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技術簡介- 7 -</p><p> 2.3.5
7、 WCF簡介- 7 -</p><p> 2.3.6 jQuery庫簡介- 8 -</p><p> 2.4系統(tǒng)設計與實現- 8 -</p><p> 2.4.1 分層架構核心思想- 8 -</p><p> 2.4.2 實體介紹- 9 -</p><p> 2.4.3 數據庫設計- 10 -&l
8、t;/p><p> 2.4.4 實體類的設計與實現- 12 -</p><p> 2.4.5 接口設計- 12 -</p><p> 2.4.6 IoC 容器及依賴注入機制的設計- 14 -</p><p> 2.4.7 數據訪問層的實現- 17 -</p><p> 2.4.8 業(yè)務邏輯層的實現- 2
9、4 -</p><p> 2.4.9 表示層的實現- 26 -</p><p> 2.4.10 視頻模塊的實現- 28 -</p><p> 3 系統(tǒng)功能演示- 30 -</p><p> 3.1系統(tǒng)功能演示- 30 -</p><p> 3.2小結- 36 -</p><p&g
10、t;<b> 1 緒論</b></p><p> 忽如一夜春風來,“上網”突然成了很“cool”的事,網上影院、伊妹兒、QQ、黑客……越來越多的網絡語言融入了我們的日常用語,網絡成了我們生活一部分。電腦起源于二戰(zhàn),而網絡則不折不扣的起源于冷戰(zhàn)。網絡的正常穩(wěn)定發(fā)展是從1995年以后,從1995年到至今,短短的十幾年間,Internet進入了全速發(fā)展時期,它已經成為我們生活中不可缺少的重要一
11、環(huán)了。</p><p> Internet規(guī)模逐日擴大,人們對網絡速度的要求也越來越高。信息的獲取、處理、交流和應用能力,已經成為人們最重要的能力之一。而在網絡上,發(fā)布、查看相關信息的方式也越來越多,比如門戶網站,新聞組,電子郵件,還有最近幾年流行起來的BBS, 博客,播客,貼吧等等。博客是一種基于互聯網分享個人心得及其他一些個人認為是有用信息的方式。從發(fā)展之初,博客就帶有雙重功能,一方面它是很棒的在線寫日志的
12、工具,另一方面也是絕佳的交流工具。</p><p><b> 1.1 博客概況</b></p><p> 1.1.1 博客的產生</p><p> “博客”這個詞,最早起源于中國,史學界普遍認為最早來自于中國秦代。當時張良為了刺殺秦始皇,找到一位俠客,并選定博浪沙作為刺殺地點,結果刺殺失敗。但大秦帝國還是被這一突發(fā)事件所震驚,紛紛在第一時
13、間予以報道。無數竹簡在驛道上往返奔馳,上面的新聞只刻著一行朱色的篆字:“博浪沙之俠客?!庇纱丝梢姡安┛汀钡淖畛鹾x是指突發(fā)性大事件。后來這個詞的意義被進一步引申,代指“值得一看的東西”、“另人震驚的事件”或“富有新聞價值的言論”。</p><p> 最古老的博客原型是NCSA的“What's New Page”網頁,主要是羅列Web上新興的網站索引,這個頁面從93年6月開始,一直更新到1996年6月為
14、止。但是最早的博客是Userland公司CEO Dave Winer,在1997年開始運作的Scripting News開始真正具備了博客的基本重要特性。并且他將這些功能集成到免費軟件“Frontier腳本環(huán)境”。不過,這個算不算是真正的最早博客,爭議頗多。有人認為,從形式上說,是Jorn Barger于1997年底建立了今天博客網站的基本模樣(當時的原始模樣可以上網看到。網管人員使用log(log files)來指稱“系統(tǒng)記錄文件”,
15、因此幾年前如果用google來查weblog,查出來大多都是例如Seacloak這種網站流量分析軟件,而不像今天真正的weblog。</p><p> 1.1.2 博客的現狀</p><p> 博客(Blog)在中國的發(fā)展歷程始于1998年,但到了2000年才開始真正流行。而2000年博客開始進入中國,并迅速發(fā)展,但都業(yè)績平平。直到2004年木子美事件,才讓中國民眾了解到了博客,并運用
16、博客。2005年,國內各門戶網站,如新浪、搜狐,原不看好博客業(yè)務,也加入博客陣營,開始進入博客春秋戰(zhàn)國時代。起初,Bloggers將其每天瀏覽網站的心得和意見記錄下來,并予以公開,來給其他人參考和遵循。但隨著Blogging快速擴張,它的目的與最初已相去甚遠。目前網絡上數以千計的Bloggers發(fā)表和張貼Blog的目的有很大的差異。不過,由于溝通方式比電子郵件、討論群組更簡單和容易,Blog已成為家庭、公司、部門和團隊之間越來越盛行的溝
17、通工具,因為它也逐漸被應用在企業(yè)內部網絡(Intranet)。</p><p> 1.2 博客的發(fā)展、需求與前景</p><p> 2001年9月11日,世貿大樓遭遇恐怖襲擊,博客成為重要信息和災難親身體驗的重要來源。從此,博客正式步入主流社會的視野。正是這場恐怖的襲擊,使人們對于生命的脆弱、人與人溝通的重要、最即時最有效的信息傳遞方式,有了全新的認識。</p><
18、p> 從發(fā)展之初,博客就帶有雙重功能,一方面它是很棒的在線寫日志的工具,它可以記錄個人的生活,以文字形式展現自我,同時也能讓網絡上的其他人來了解自己,博客就是一個展示自我的舞臺;另一方面博客也是絕佳的交流工具,利用博客可以發(fā)一些重要的新聞,以最直接、最高效的方式來與他人溝通。正如世貿大樓遭遇恐怖襲擊事件,網絡成為第一個事件信息的來源,由此可見博客的重要性。開發(fā)一個個人博客系統(tǒng),就是基于這樣一個想法,通過各種方式來展現自我,與他人
19、溝通。</p><p> 1.3 本論文任務概述</p><p> 這個畢業(yè)設計的最終目標是設計、實現一個功能完善的個人博客系統(tǒng)。這個系統(tǒng)是基于.NET Framework 3.5運用ASP.NET 2.0技術來實現的,開發(fā)語言是C#語言。在這個系統(tǒng)中將利用一些較新的技術來增加用戶體驗。</p><p> 我負責整個系統(tǒng)的架構設計、編碼、測試等。這篇論文我主要
20、先對博客進行簡要的介紹,然后介紹了開發(fā)本系統(tǒng)所用到的新技術,接著對整個系統(tǒng)中的模塊進行設計,然后既要剖析部分代碼,最后演示完整的系統(tǒng)。</p><p> 1.4 本論文章節(jié)安排</p><p> 第二章開始介紹了系統(tǒng)開發(fā)環(huán)境及相關技術。接著詳細介紹了系統(tǒng)設計與實現,分別從需求分析、數據庫設計、模塊詳細設計作了詳細的描述。最后剖析了部分代碼。</p><p>
21、第三章對完成的系統(tǒng)進行演示。</p><p> 最后對本論文進行小結,主要描述了在做本系統(tǒng)的過程中遇到的問題及解決方法以及在本系統(tǒng)中我學到了一些知識,以及對給與我?guī)椭娜吮硎局轮x。</p><p><b> 2 系統(tǒng)設計與實現</b></p><p><b> 2.1 需求分析</b></p><
22、p> 2.1.1 功能需求</p><p> 一般博客的功能包括:</p><p> 所有人能瀏覽博客的內容(文章、相片、視頻等);</p><p> 所有人可以留言,留言可以是針對文章的評論,也可以是給博主的留言;</p><p> 博主可以登錄,他人無法登錄;</p><p> 博主登錄后可以發(fā)表
23、、刪除、更新文章、相片、視頻等內容。他人無法對博客內容操作;</p><p> 博主可以對所有人的留言進行管理(刪除)操作,也可以回復留言者。</p><p> 2.1.2 項目計劃安排</p><p> 項目整體的開發(fā)計劃如圖2-1,此圖是用Visio 2007生成的,主要描述了項目的整體的安排和各個部分在整個項目開發(fā)周期中所占的時間比重。</p>
24、;<p> 圖2-1項目安排計劃</p><p> 2.2 系統(tǒng)開發(fā)環(huán)境</p><p> 2.2.1開發(fā)環(huán)境簡介 </p><p><b> 硬件配置:</b></p><p> 機器:Thinkpad</p><p> CPU: Core 2 T5670 1.8GHz
25、</p><p> 內存: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平臺應用程序開發(fā)環(huán)境。Visual Studio 2008 在三個方
27、面為開發(fā)人員提供了關鍵改進:快速的應用程序開發(fā)、高效的團隊協(xié)作和突破性的用戶體驗。Visual Studio 2008可以用來創(chuàng)建 Windows 平臺下的 Windows 應用程序和網絡應用程序,也可以用來創(chuàng)建網絡服務、智能設備應用程序和 Office 插件。</p><p> 2.2.3 SQL Server 2005數據庫簡介</p><p> SQL Server 2005 是
28、一個全面的數據庫平臺,使用集成的商業(yè)智能 (BI) 工具提供了企業(yè)級的數據管理。SQL Server 2005 數據庫引擎為關系型數據和結構化數據提供了更安全可靠的存儲功能,可以構建和管理用于業(yè)務的高可用和高性能的數據應用程序。</p><p> SQL Server 2005已經與Visual Studio 和.NET Framework進行了集成。據微軟官方顯示,利用SQL Server 2005 和 Vi
29、sual Studio進行開發(fā),開發(fā)速度提高了40%以上,在很多場景中,能減少50%-70%代碼量。</p><p> 考慮到SQL Server 2005與.NET平臺的集成性和便利性,同時也考慮到技術之間的銜接、系統(tǒng)的性能和運行的穩(wěn)定性,所以本系統(tǒng)使用的是SQL Server 2005 Express數據庫。</p><p><b> 2.3相關技術簡介</b>
30、;</p><p> 2.3.1 C#語言簡介</p><p> C#語言是一門簡單、現代、優(yōu)雅、面向對象、類型安全、平臺獨立的一門新型組件編程語言。經過編譯,C#編寫的源代碼被編譯為一種符合CLI規(guī)范的中間語言(IL),通常是具有擴展名為.exe和.dll的文件。運行時,由CLR加載IL元數據和引用的資源,然后轉換成機器語言再執(zhí)行。本系統(tǒng)采用C#語言來開發(fā)各個組件、功能模塊。<
31、/p><p> 2.3.2 ASP.NET 簡介</p><p> ASP.NET 是一個統(tǒng)一的 Web 開發(fā)模型,作為 .NET Framework 的一部分提供。當在編寫 ASP.NET 應用程序的代碼時,可以訪問.NET Framework 中的類。</p><p> ASP.NET 中有一個重要功能,可以通過與客戶端應用程序中類似的、基于事件的模型來對網頁
32、進行編程。與傳統(tǒng) HTML 頁或基于客戶端的 Web 應用程序中的事件相比,由 ASP.NET 服務器控件引發(fā)的事件的工作方式稍有不同。導致差異的主要原因在于事件本身與處理該事件的位置的分離。在基于客戶端的應用程序中,在客戶端引發(fā)和處理事件。但是,在 ASP.NET 網頁中,與服務器控件關聯的事件在客戶端(瀏覽器)上引發(fā),但由 ASP.NET 頁在 Web 服務器上處理。</p><p> 對于在客戶端引發(fā)的事
33、件,ASP.NET Web 控件事件模型要求在客戶端捕獲事件信息,并通過 HTTP POST 將事件消息傳輸到服務器。頁必須解釋該 POST 以確定所發(fā)生的事件,然后在要處理該事件的服務器上調用代碼中的相應方法。</p><p> 本系統(tǒng)中在UI層的表示層邏輯就是基于ASP.NET的Web事件模型進行編程的。利用這種編程模型既可以簡化Web應用程序的開發(fā)又可以實現出功能非常強大系統(tǒng)。</p>&l
34、t;p> 2.3.3 ADO.NET 簡介</p><p> Microsoft在開始設計.NET 框架時設計了一個新的數據訪問框架ADO.NET。ADO.NET具有如下優(yōu)點:提供了斷開的數據訪問模型;提供了與 XML 的緊密集成;提供了與 .NET 框架的無縫集成(例如,兼容基類庫類型系統(tǒng))。</p><p> ADO.NET提供兩種訪問模式:斷開連接模式和連接模式。使用斷開
35、連接模式一般利用DataAdapter從數據源檢索數據并填充 DataSet 中的表,同時還可將對 DataSet 所做的更改解析回數據源。而使用連接模式是利用ADO.NET DataReader 從數據庫中檢索只讀、只進的數據流。查詢結果在查詢執(zhí)行時返回,在并存儲在客戶端的網絡緩沖區(qū)中,直到程序使用 DataReader 的 Read 方法對它們發(fā)出請求。使用 DataReader 可以提高應用程序的性能,原因是它只要數據可用就立即檢
36、索數據,并且(默認情況下)一次只在內存中存儲一行,減少了系統(tǒng)開銷。</p><p> 創(chuàng)建一個DataSet對象的系統(tǒng)開銷是比較大的。如果大范圍的使用DataSet,對系統(tǒng)的壓力會增大很多。DataSet本身是弱類型的,在業(yè)務邏輯處理層進行操作時會存在類型安全的隱患,并且在編碼時也不能提供代碼提示的便捷性。雖然可以構建強類型的DataSet,但是會增加大量的代碼。另外如果深度使用DataSet,比如用到Data
37、Relation等,又會牽扯到與數據庫的同步問題,及數據庫關于加鎖機制的問題。這樣會增大技術復雜度,這是沒有必要的。在本系統(tǒng)中使用是連接方式來讀取數據,同時使用泛型List來承載數據,每讀一條數據就存儲到泛型List中去,泛型List相對于弱類型的DataSet省去了不必要的裝箱和拆箱操作,大大提高了性能。</p><p> 2.3.4 Silverlight技術簡介</p><p>
38、 Microsoft Silverlight 是一種跨瀏覽器、跨平臺的用于為 Web 生成和提供下一代媒體體驗和豐富的交互式應用程序 (RIA)。Silverlight 統(tǒng)一了服務器、Web 和桌面的功能,統(tǒng)一了托管代碼和動態(tài)語言、聲明性編程和傳統(tǒng)編程以及 Windows Presentation Foundation (WPF) 的功能。可以采用C# 和 VB.NET編程語言來編寫托管代碼,并可以全面使用.NET框架庫。技術細節(jié)請參見
39、Silverlight SDK或者MSDN等資料,本系統(tǒng)涉及到的詳細代碼請參見3.2.8節(jié)。</p><p> 由于在開發(fā)上有.NET強大類庫的支撐,同時在IDE上又有Visual Studio 2008、Blend2這樣的工具,與服務器通信又有WCF這樣的技術做鋪墊。所以本人選擇Silverlight作為這個畢業(yè)設計的前端展示技術。</p><p> 2.3.5 WCF簡介</
40、p><p> Windows通信基礎(Windows Communication Foundation,WCF)是微軟分布式應用程序開發(fā)的集大成者,它整合了.Net平臺下所有的和分布式系統(tǒng)有關的技術,例如.Net Remoting、ASMX、WSE和MSMQ。以通信(Communiation)范圍而論,它可以跨進程、跨機器、跨子網、企業(yè)網乃至于 Internet;以宿主程序而論,可以以ASP.NET,EXE,WPF
41、,Windows Forms,NT Service,COM+作為宿主(Host)。WCF可以支持的協(xié)議包括TCP,HTTP,跨進程以及自定義,安全模式則包括SAML, Kerberos,X509,用戶/密碼,自定義等多種標準與模式。也就是說,在WCF框架下,開發(fā)基于SOA的分布式系統(tǒng)將變得非常容易。</p><p> 本系統(tǒng)也涉及部分WCF技術,主要用在Silverlight與后臺數據的交互上。 Silverl
42、ight僅僅支持的一種綁定,那就是BasicHttpBinding協(xié)議,而這正是WCF所支持的一種基本協(xié)議。這樣WCF與Silverlight兩種技術之間有了更好的銜接,同時這給我在系統(tǒng)的開發(fā)中提供了很好的便利性。</p><p> 詳細的代碼請參見源碼部分。</p><p> 2.3.6 jQuery庫簡介</p><p> jQuery由美國人John R
43、esig創(chuàng)建。jQuery是繼prototype之后又一個優(yōu)秀的JavaScript框架。它是輕量級的js庫(壓縮后只有21k),這是其它的JavaScript庫所不及的,它兼容CSS3,還兼容各種瀏覽器。jQuery是一個快速的,簡潔的JavaScript庫,使用戶能更方便地處理HTML documents、events、實現動畫效果,并且方便地為網站提供AJAX交互。</p><p> jquery的簡單的
44、實用的確有相當大的吸引力。本系統(tǒng)在UI層就應用了jQuery庫,用來展現一些界面特效。詳細的代碼請參見源碼部分。</p><p> 2.4系統(tǒng)設計與實現</p><p> 2.4.1 分層架構核心思想</p><p> 1、針對接口編程,而不針對實現編程</p><p> 針對接口編程,而不是針對實現編程--這是面向對象設計中最重要的
45、原則之一這里所指的接口,不是特指編程語言中的具體語言元素(如C#中由Interface定義的語言接口),而是只一種抽象的,在語義層面上起著接合作用語義體。它的具體實現,可能是接口,可能是抽象類,甚至可能是具體類。一般接口可以理解為以下兩點:</p><p> 接口是一組規(guī)則的集合,它規(guī)定了實現本接口的類或接口必須擁有的一組規(guī)則。體現了自然界“如果你是……則必須能……”的理念。</p><p&
46、gt; 接口是在一定粒度視圖上同類事物的抽象表示。</p><p> 具體到N層架構中,針對接口編程的意義是這樣的:現約定將N層架構的各層依次編號為1、2、…、K、…、N-1、N,其中層的編號越大,則越處在上層,那么第 K 層不應該依賴具體一個 K-1 層,而應該依賴一個 K-1 層的接口,即在第 K 層中不應該有 K-1 層中的某個具體類。</p><p><b> 2、
47、依賴倒置原則</b></p><p> 在軟件設計原則中,有一種重要的思想叫做依賴倒置。它的核心思想是:不能讓高層組件依賴底層組件,而且,不管高層組件和底層組件,兩者都應依賴于抽象。所謂的依賴倒置原則,其實就是上面提到針對接口編程,而不是針對實現編程,兩者在本質上是統(tǒng)一的。 </p><p> 綜上所述,本系統(tǒng)應該是這樣一種架構: </p><p>
48、 N層架構的各層依次編號為 1、2、…、K、…、N-1、N,其中層的編號越大,則越處在上層。 </p><p> 架構中僅存在一種依賴,即第 K 層接口依賴第 K-1 層,其中 1<K<=N。</p><p><b> 3、封裝變化</b></p><p> 封裝變化的原則定義為:找出應用中可能需要變化之處,把它們獨立出來,
49、不要和那些不需要變化的代碼混雜在一起。</p><p><b> 4、開放、關閉原則</b></p><p> 開發(fā)-關閉原則定義為:對擴展開放,對修改關閉。</p><p><b> 5、單一職責原則</b></p><p> 任何一個類都應該有單一的職責,屬于單獨的一層,而不能同時擔負兩
50、種職責或屬于多各層。</p><p> 三層架構是一種比較成熟的系統(tǒng)架構,通過將整個系統(tǒng)分為不同的邏輯塊,大大降低了應用系統(tǒng)開發(fā)和維護的成本。三層架構將數據訪問和邏輯操作都集中到組件中,增強了系統(tǒng)的復用性。同時也使系統(tǒng)的擴展性大大增強。模塊化使得系統(tǒng)很容易在縱向和水平兩個方向拓展:一方面可以將系統(tǒng)升級為更大、更有力的平臺,另一方面也可以適當增加規(guī)模來增強系統(tǒng)的網絡應用。</p><p>
51、 從開發(fā)角度和應用角度來看,三層架構比雙層或單層結構都有更大的優(yōu)勢。三層結構適合群體開發(fā),每人可以有不同的分工,協(xié)同工作使效率倍增。開發(fā)雙層或單層應用時,每個開發(fā)人員都應對系統(tǒng)有較深的理解,能力要求很高,開發(fā)三層應用時,則可以結合多方面的人才,只需少數人對系統(tǒng)全面了解,從一定程度工降低了開發(fā)的難度。</p><p> 基于以上優(yōu)點本系統(tǒng)采用三層架構來開發(fā)。</p><p> 2.4.
52、2 實體介紹</p><p> 根據對本博客系統(tǒng)的簡要需求分析,可以確定以下幾個實體:</p><p> 用戶信息:代表用戶,包括了用戶的登錄名、密碼、個性設置等。</p><p> 博客留言:代表一些人對博客的評價等信息。</p><p> 博客信息:包含了博客的基本信息,如博客名稱、訪問人數、主題等。</p><
53、;p> 文章:就是文章實體,包含文章的基本信息,如標題、內容、發(fā)布時間等。</p><p> 文章分類:就是文章的類別。</p><p> 文章評論:代表了對于莫一篇文章發(fā)表的評論。</p><p> 照片:代表照片基本信息。</p><p> 照片分類:代表照片的分類。</p><p> 2.4.3
54、 數據庫設計</p><p><b> 圖2-2數據庫表</b></p><p> 整個系統(tǒng)涉及的數據庫的表有8張,各個表之間的關系如圖2-2。以下是各個表的簡要說明:</p><p> UserInfo:用戶表。主要保存了博主的相關信息。</p><p> Leavewords:留言表。主要保存訪問者對整個Bl
55、og的評論。</p><p> BlogInfo:博客表。主要存放Blog的基本設置信息。</p><p> PhotoCategory:圖片分類表。主要存放圖片的分類信息。</p><p> Photo:圖片表。主要存放圖片信息。</p><p> PostCategory:文章分類表。文章分類信息。</p><
56、p> Post:文章表。文章的基本信息。</p><p> Comment: 文章評論表。文章的相關評論信息。</p><p> 圖2-3完整顯示了整個系統(tǒng)設計到的表。</p><p><b> 圖2-3數據庫表</b></p><p> 存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存
57、儲并作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執(zhí)行,而且允許聲明變量、有條件執(zhí)行以及其它強大的編程功能。存儲過程在創(chuàng)建時即在服務器上進行編譯,所以執(zhí)行起來比單個 SQL 語句快。由于存儲過程在性能上和功能上相對于單個SQL語句有較大的優(yōu)勢,所以在系統(tǒng)中采用存儲過程。圖2-4展示了系統(tǒng)所用到的存儲過程。</p><p><b> 圖2-4 存儲過程</b></p
58、><p> 2.4.4 實體類的設計與實現</p><p> 實體類是對實體的封裝,它通常包括私有變量及對應的 get、set 方法,而在 C#語言中,將 get、set 方法又組合成屬性。這些私有變量或者屬性,則對應現實實體相應的屬性。實體類的作用主要有兩個,一是作為現實實體的計算機代表,二是數據的傳遞。在分層架構的應用中,數據正是封裝在實體類中,然后以實體類為載體在各個層次間傳遞。這樣
59、不但符合面向對象設計的原則,也便于對數據存取進行控制。理想情況下,實體類中不能含有任何邏輯,它應該單純是數據的封裝。所以,它不應該有方法,當然構造函數除外。基于以上分析,我們設計的實體類,應該是準確、干凈、易用。準確表明實體類應該準確無誤地表示現實中的實體,干凈表示實體類應該僅包含數據的封裝而不摻雜任何邏輯或者與數據封裝無關的東西,易用表示實體類應該很容易地用來在各層之間傳遞數據。</p><p> 本系統(tǒng)不需
60、考慮特殊實體類的情況,僅需編寫簡單的實體類即可。詳細信息請參見相關代碼。完整的類庫如圖2-5所示。</p><p><b> 圖2-5 實體類庫</b></p><p> 2.4.5 接口設計</p><p> 接口有以下幾個作用: </p><p> 接口明確了各層次的職責。 </p><p
61、> 接口決定了各個層次具體需要實現的功能。 </p><p> 接口形成了整個分層架構的骨架。</p><p> 接口暴露了層次的 API,為上層提供了依賴點。 </p><p> 因此,接口的設計實際上處在現實需求和程序實現之間,起到承上啟下的用。它決定了需求分析中的各個需求如何合理地映射成各個層次的不同方法。所以接口的設計應該在需求分析的基礎上進行
62、。</p><p> 本系統(tǒng)中主要需要設計的接口有:數據訪問層接口、業(yè)務邏輯層接口。</p><p><b> 數據訪問層接口</b></p><p> 數據訪問層負責與數據源的交互,負責數據的創(chuàng)建、刪除、更新及查詢工作。它不應該包含任何業(yè)務邏輯或可視性元素,對它所處理數據的業(yè)務意義是“無知”的。它與數據庫系統(tǒng)一起負責數據完整性。在三層模
63、型中,數據訪問層為上層(業(yè)務邏輯層)提供了服務,數據訪問層的接口規(guī)定了數據訪問層的功能,業(yè)務邏輯層針對接口進行編程,不管數據訪問層如何變化,只要接口不變,業(yè)務邏輯層都不需要變動。這樣在開發(fā)系統(tǒng)中將可變因素減少到最少,這也就是分層架構的最基本的思想:針對接口編程,而不針對實現編程。以下列出本系統(tǒng)中完整的類庫,如圖2-6所示。</p><p> 圖2-6 數據訪問層接口</p><p>&l
64、t;b> 業(yè)務邏輯層接口</b></p><p> 在設計業(yè)務邏輯層接口之前,需要對業(yè)務邏輯層的職責進行明確。業(yè)務邏輯層的職責敘述如下:業(yè)務邏輯層負責完成與系統(tǒng)領域相關的業(yè)務邏輯操作,實現過程中的數據訪問操作通過調用數據訪問層實現。它對業(yè)務相關的數據有效性負責,但是不負責 UI 輸入數據的有效性。業(yè)務邏輯層中不能含有與顯示相關的邏輯,不能決定或影響數據最終的呈現樣式。 由于不同領域的業(yè)務邏輯
65、差別很大,所以無法像數據訪問層那樣對接口操作做出明確的分類。在實際項目開發(fā)中,業(yè)務邏輯層接口的設計往往要和領域專家合作。而在本博客系統(tǒng)中,由于業(yè)務邏輯都是比較簡單的,所以不用進行專門的領域邏輯調研。完整的類庫如圖2-7所示。</p><p> 圖2-7 業(yè)務邏輯層接口</p><p> 2.4.6 IoC 容器及依賴注入機制的設計</p><p> 1、IoC
66、 容器及依賴注入機制的設計</p><p> 依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(調用者)需要另一個角色(被調用者)的協(xié)助時,在傳統(tǒng)的程序設計過程中,通常由調用者來創(chuàng)建被調用者的實例。但在具有依賴注入的系統(tǒng)里,創(chuàng)建被調用者的工作不再由調用者來完成,因此稱為控制反轉。創(chuàng)建被調用者實例的工作通常由 Ioc 容
67、器來完成,然后注入調用者,因此也稱為依賴注入。 具體到分層架構中,依賴注入可以這樣理解:當上層類的需要調用下層類功能時,不再是由上層類直接實例化下層類,而是通過 IoC 容器獲取一個下層類的實例,然后注入到上層類中。 </p><p> IoC 容器負責根據配置信息,創(chuàng)建不同的數據訪問層及業(yè)務邏輯層實例,并將其注入到業(yè)務邏輯層與表示層中,從而實現三個層次的解耦。</p><p> 依賴
68、注入機制的實現有兩種途徑,一種是使用現有的框架。如 J2EE 平臺上的 Spring 框架就可以很好的完成依賴注入功能,在.NET 平臺上有 Spring.NET等框架可以選擇。另一種途徑,就是自己編寫相應的代碼,完成依賴注入機制。 </p><p> 鑒于.NET 平臺上的“反射”機制對依賴注入的實現非常方便,所以本系統(tǒng)將采用第二種方案,使用 Abstract Factory 設計模式和反射機制完成依賴注入的
69、設計。</p><p> 2、Abstract Factory模式的應用</p><p> Abstract Factory模式是在依賴注入機制中廣泛采用的設計模式, Spring的IoC容器就采用了這個經典模式。它的中文譯名叫做“抽象工廠”,其定義是這樣的:提供一個接口,用于創(chuàng)建相關或依賴對象的家族,而不需要指定具體類。</p><p> 以數據訪問層注入到
70、業(yè)務邏輯層為例(業(yè)務邏輯層注入到表示層的原理類似) ,先假設該博客系統(tǒng)中僅有用戶和文章兩個實體,并且我們的系統(tǒng)需要能訪問 SQLServer 和 Oracle 兩個數據庫,那么,系統(tǒng)中就需要 SQLServerDAL 和 OracleDAL 兩個數據訪問層,它們都含有兩個數據訪問類,分別是 SQLServerUserDAL、SQLServerPostDAL和 OracleUserDAL、OraclePostDAL。此時,用戶和帖子的業(yè)務
71、邏輯層類UserBLL與 PostBLL 作為客戶類,不應該與具體的數據訪問層類耦合,而應該先定義接口 IUserDAL 與 IPostDAL 接口,讓業(yè)務邏輯層與這兩個接口耦合。再設計SQLServerDALFactory與 OracleDALFactory,分別作為生成兩種數據訪問層的工廠,最后通過配置信息,決定在業(yè)務邏輯層中實例化哪個工廠。如圖2-8所示。</p><p> 圖2-8 Ioc容器注入原理&
72、lt;/p><p> Abstract Factory模式雖然可以完成依賴注入的機制的設計,但是其本身也有缺陷。從上文可以看出,就數據訪問層而言,每個數據訪問層實現都要對應一個工廠,業(yè)務邏輯層當然也是如此。并且以后每當添加一個新的實現,都要寫一個相應的工廠。因此,當層次的實現過多時,整個系統(tǒng)就會存在很多工廠,這些工廠不僅使代碼變得臃腫,也難以維護。 </p><p> .NET平臺上,有一
73、種叫“反射”的機制,利用這種機制,可以簡化Abstract Factory設計模式的代碼。而利用反射機制簡化后的 Abstract Factory 則可以叫做Reflection Abstract Factory,也叫反射工廠。 </p><p> 反射就是動態(tài)發(fā)現類型信息的能力。它幫助程序設計人員在程序運行時利用一些信息去動態(tài)地使用類型,這些信息在設計時是未知的,這種能力可以用于后期綁定。反射還支持的更高級的
74、行為,能在運行時動態(tài)創(chuàng)建新類型,并且對這些新類型的操作進行調用。 </p><p> 有了反射機制,我們就可以從配置文件(一般是在 Web.config)讀出配置信息后,不是根據這個信息實例化相應的工廠,而是讓反射工廠通過這些信息,動態(tài)加載相應程序集中的類,這樣每個層次只需要一個工廠就可以完成依賴注入,即使以后出現新的實現,也不需要修改或添加工廠,只要在配置文件中寫明程序集的名字即可。如果考慮到性能和易用性,可
75、以配合緩存機制和 Facade 設計模式進一步優(yōu)化 IoC 的設計。最終反射工廠結構圖如圖2-9所示。</p><p> 圖2-9 反射工廠結構圖</p><p> 圖2-10 反射工廠示意圖</p><p> 在圖2-10中DALFactory 和 BLLFactory 的實例化箭頭直接指向了 IDAL 和IBLL。實際上,IDAL 和 IBLL 分別是一個
76、工程,它里面是一組接口,這里不是指工廠直接實例化接口(實際上接口也是不可能被實例化的)。 </p><p> 使用反射機制后,同一層次的不同實現分別放在不同工程下,而里面包含的各個類的名字是一致的。例如 SQLServerDAL 下和 OracleDAL 下都有UserInfoDAL,至于運行時具體實例化哪個,是通過 Web.config 中配置實現的。也就是說Web.config 決定了實例化哪個工程下的Us
77、erInfoDAL。</p><p> 2.4.7 數據訪問層的實現</p><p> 數據訪問層的實現一般有兩種方式:基于樸素的實現和基于ORM框架的實現。對于ORM由于篇幅原因不做過多描述。本系統(tǒng)采用數據訪問層的樸素實現,就是指傳統(tǒng)的通過執(zhí)行 SQL 語句或調用存儲過程實現對數據庫的操作。.NET 平臺內置了豐富的對數據庫進行操作的類庫,因此數據訪問層的樸素實現非常方便。 <
78、/p><p> 具體到本課題中,數據訪問層的樸素實現操作一般分為以下兩種方式。 </p><p> 使用動態(tài) SQL 語句: </p><p><b> 獲取參數。 </b></p><p> 動態(tài)組合 SQL 語句。 </p><p> 執(zhí)行 SQL 語句。 </p><
79、;p><b> 返回結果。 </b></p><p><b> 使用存儲過程: </b></p><p><b> 獲取參數。 </b></p><p> 生成存儲過程可用參數形式。 </p><p><b> 調用存儲過程。 </b>&l
80、t;/p><p><b> 返回結果。 </b></p><p> 存儲過程相對于動態(tài)SQL語句有一定的優(yōu)越性。在本系統(tǒng)中都將采用存儲過程。在系統(tǒng)中由于每次執(zhí)行存儲過程時,都需要一系列類似的操作,因此我在系統(tǒng)中對這個模塊進行了一次封裝,這樣可以大大減少重復性代碼。在本系統(tǒng)的實現中,將各種封裝對數據庫操作的輔助類叫做 DALHelper 類,如對 SQLServer 數
81、據庫進行操作的輔助類就叫做 SQLServerHelper,它包含了四個方法:ExecuteSQLNonQurey、ExecuteSQLReader、ExecuteProcedureNonQurey、ExecuteProcedureReader,分別用于執(zhí)行存儲過程返回不同的結果。這樣,在 SQLServer 數據訪問層中,就可以直接調用這些方法完成操作。樸素實現的示意圖如圖2-11所示。</p><p> 圖
82、2-11 數據庫訪問層的樸素實現</p><p> 本系統(tǒng)的數據訪問模塊工程如圖2-12所示。</p><p> 圖2-12 數據訪問模塊</p><p> DAL:類庫。實現IDAL接口,主要包含各個實體所具有的操作。文件列表如圖2-11。</p><p> Factory:類庫。產生DAL或者BLL的實現。</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> 這個類主要包含兩個方法,GetFromCache和SaveToCache。顧名思義就是一個從緩存里取,一個是把對象往緩存里加。</p><p> 從緩存里取的時候可能是返回的NULL,表示這個對象之前并沒有被緩存,這個值在DependencyProvider.cs里面有判斷。另一個方法是把一個對象往緩存里面加,注意最后一個參數是一個緩存依賴,這
94、個參數是指如果這個依賴的文件(或者其他什么)一旦變化了,那么緩存里的東西就會銷毀。</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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設計----個人博客系統(tǒng)的設計與實現
- 畢業(yè)設計---個人博客系統(tǒng)的設計與實現
- 畢業(yè)設計---個人博客的設計與實現
- 個人博客網站的設計與實現畢業(yè)設計
- 畢業(yè)設計--個人博客網站的設計與實現
- 畢業(yè)設計---個人博客系統(tǒng)設計
- 畢業(yè)設計----小型博客系統(tǒng)的設計與實現
- 個人博客系統(tǒng)畢業(yè)論文--博客網站的設計與實現
- 個人博客系統(tǒng)畢業(yè)設計論文
- 基于php個人博客的設計與實現畢業(yè)設計答辯
- php畢業(yè)設計--基于bs模式的個人博客系統(tǒng)的設計與實現
- 個人博客系統(tǒng)畢業(yè)設計論文
- php畢業(yè)設計--基于php的個人博客系統(tǒng)的實現
- 個人博客系統(tǒng)的設計與實現 畢業(yè)論文
- 個人博客系統(tǒng)的設計與實現
- 個人博客系統(tǒng)的設計與實現畢業(yè)論文
- 基于php個人博客的設計與實現畢業(yè)設計答辯ppt
- 個人博客系統(tǒng)畢業(yè)設計論文 (2)
- jsp個人博客系統(tǒng)-畢業(yè)設計論文
- 畢業(yè)設計---博客網站的設計與實現
評論
0/150
提交評論