




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
常用的三層架構設計軟件系統(tǒng)最常用的一般會講到三層架構,其實就是將整個業(yè)務應用劃分為表示層、業(yè)務邏輯層、數(shù)據(jù)訪問層等,有的還要細一些,通過分解業(yè)務細節(jié),將不同的功能代碼分散開來,更利于系統(tǒng)的設計和開發(fā),同時為可能的變更提供了更小的單元,十分有利于系統(tǒng)的維護和擴展。常見的三層架構基本包括如下幾個部分,如圖1所示。圖1常見的三層架構l數(shù)據(jù)訪問層DAL:用于實現(xiàn)與數(shù)據(jù)庫的交互和訪問,從數(shù)據(jù)庫獲取數(shù)據(jù)或保存數(shù)據(jù)到數(shù)據(jù)庫的部分。2業(yè)務邏輯層BLL:業(yè)務邏輯層承上啟下,用于對上下交互的數(shù)據(jù)進行邏輯處理,實現(xiàn)業(yè)務目標。3表示層Web:主要實現(xiàn)和用戶的交互,接收用戶請求或返回用戶請求的數(shù)據(jù)結果的展現(xiàn),而具體的數(shù)據(jù)處理則交給業(yè)務邏輯層和數(shù)據(jù)訪問層去處理。日常開發(fā)的很多情況下為了復用一些共同的東西,會把一些各層都用的東西抽象出來。如我們將數(shù)據(jù)對象實體和方法分離,以便在多個層中傳遞,例如稱為Model。一些共性的通用輔助類和工具方法,如數(shù)據(jù)校驗、緩存處理、加解密處理等,為了讓各個層之間復用,也單獨分離出來,作為獨立的模塊使用,例如稱為Common。此時,三層架構會演變?yōu)槿鐖D2所示的情況。
圖2三層架構演變結果4業(yè)務實體Model:用于封裝實體類數(shù)據(jù)結構,一般用于映射數(shù)據(jù)庫的數(shù)據(jù)表或視圖,用以描述業(yè)務中客觀存在的對象。Model分離出來是為了更好地解耦,為了更好地發(fā)揮分層的作用,更好地進行復用和擴展,增強靈活性。5通用類庫Common:通用的輔助工具類。在第5.2節(jié)中我們講過可以將對數(shù)據(jù)庫的共性操作抽象封裝成數(shù)據(jù)操作類(例如DbHelperSQL),以便更好地復用和使代碼簡潔。數(shù)據(jù)層底層使用通用數(shù)據(jù)庫操作類來訪問數(shù)據(jù)庫,最后完整的三層架構如圖3所示。圖3最后完整的三層架構數(shù)據(jù)庫訪問類是對ADO.NET的封裝,封裝了一些常用的重復的數(shù)據(jù)庫操作。如微軟的企業(yè)庫SQLHelper.cs,動軟的DBUtility/DbHelperSQL等,為DAL提供訪問數(shù)據(jù)庫的輔助工具類。通過以上分析,我們知道如今常用的三層架構是個什么樣子,同時,我們也知道了三層架構在使用過程中的一些演化過程。那么,為什么要這樣分層,每層結構到底又起什么作用呢?我們繼續(xù)往下看。趣味理解:三層架構與養(yǎng)豬看新聞報道今年豬肉價格一路高漲,據(jù)說有人養(yǎng)豬都發(fā)財致富奔小康了,程序員都說寫代碼沒前途了,還不如去養(yǎng)豬,不過,可別認為養(yǎng)豬沒有技術含量,比寫代碼容易,其實養(yǎng)豬也大有學問。為了更好地理解三層架構,就拿養(yǎng)豬來做個例子吧。俗話說:“沒吃過豬肉,還沒見過豬跑??!”。圖4是三層架構化的養(yǎng)豬產(chǎn)業(yè)流水線趣味對此圖。圖4三層結構與養(yǎng)豬對比圖3與圖4,我們可以看出:數(shù)據(jù)庫好比豬圈,所有的豬有序地按區(qū)域或編號,存放在不同的豬欄里。DAL好比是屠宰場,把豬從豬圈取出來進行(處理)屠殺,按要求取出相應的部位(字段),或者進行歸類整理(統(tǒng)計),形成整箱的豬肉(數(shù)據(jù)集),傳送給食品加工廠(BLL)。本來這里都是同一伙人既管抓豬,又管殺豬的,后來覺得效率太低了,就讓一部分人出來專管抓豬了(DBUtility),根據(jù)要求來抓取指定的豬。BLL好比食品加工廠,將豬肉深加工成各種可以食用的食品(業(yè)務處理)。Web好比商場,將食品包裝成漂亮的可以銷售的產(chǎn)品,展現(xiàn)給顧客(UI表現(xiàn)層)。豬肉好比Model,無論是哪個廠(層)各個環(huán)節(jié)傳遞的本質(zhì)都是豬肉,豬肉貫穿整個過程。通用類庫Common相當于工人使用的各種工具,為各個廠(層)提供諸如殺豬刀、繩子、剪刀、包裝箱、工具車等共用的常用工具(類)。其實,每個部門本來是可以自己制作自己的工具的,但是那樣會使效率比較低,而且也不專業(yè),并且很多工作都會是重復的。因此,就專門有人開了這樣的工廠來制作這些工具,提供給各個工廠,有了這樣的分工,工廠就可以專心做自己的事情了。當然,這里只是形象的比喻,目的是為了讓大家更好地理解,實際的情況在細節(jié)上會有所不同。這個例子也只是說明了從豬圈到商場的單向過程,而實際三層開發(fā)中的數(shù)據(jù)交互是雙向的,可取可存。不過,據(jù)說有一種機器,把豬從這頭趕進去,另一頭就噗噗嚕嚕地出火腿腸了。如果火腿腸賣不了了,從那頭再放進去,這頭豬又原原本本出來了,科幻的機器吧,沒想到也可以和三層結構聯(lián)系上。以上只是笑談,不過也使三層架構的基本概念更容易理解了。上面談了那么多,有人會問,我直接從數(shù)據(jù)庫取出內(nèi)容直接操作不可以嗎?為什么要這么麻煩地用三層架構呢?三層架構到底有什么好處呢?不分層,當然可以,就好比整個過程不分屠宰場、加工場之類的,都在同一個場所(工廠)完成所有的活(屠殺、加工、銷售)。但為什么要加工廠和商場呢?因為當規(guī)模比較大的時候,管理起來就會變得非常復雜,這樣的養(yǎng)殖方式已經(jīng)無法滿足規(guī)模化的需要了。并且,從社會的發(fā)展來看,社會分工是人類進步的表現(xiàn)。社會分工的優(yōu)勢就是讓適合的人做自己擅長的事情,使平均社會勞動時間大大縮短,生產(chǎn)效率顯著提高。能夠提供優(yōu)質(zhì)高效勞動產(chǎn)品的人才能在市場競爭中獲得高利潤和高價值。人盡其才,物盡其用最深刻的含義就是由社會分工得出的。軟件開發(fā)也一樣,做小項目的時候,分不分層確實看不出什么差別,并且顯得更麻煩啰嗦了。但當項目變大和變復雜時,分層就顯示出它的優(yōu)勢來了。所以分不分層要根據(jù)項目的實際情況而定,不能一概而論。有很多入門學者在為三層架構感到困惑,不知三層架構如何實現(xiàn),現(xiàn)在本人詳細地詳一個簡單的例子來說明三層架構的實現(xiàn),至于三層架構是什么原理,51aspx老大說得很詳細了,本人不再重復。1.打開VS2008后,文件-->新建-->項目-->其他項目類型-->VisualStudio解決方案-->空白解決方案就起名為:MvcTest
白一.BU.胃I白一.BU.胃IPropertiEEji?.泊引甬userbllcs畝_B:\...\tEB\&倉IDAI.:NiFropertiez?.泊引用userdL.ModelF謫PropertiCEes盜引用2.建立如圖5的項目,并在WEB-->App_Data建一個數(shù)據(jù)文件DabaBase.mdf里面建表:qzzm_user表內(nèi):字段Name,類型:nvarchar(50)3.在WEB中引用BLL,Model層新建Post.aspx<%@PageLanguage=&quot;C#&quot;AutoEventWireup=&quot;true&quot;CodeFile=&quot;Post?aspx?cs&quot;Inherits=&quot;Post&quot;%>2? <!DOCTYPEhtmlPUBLIC&quot;-〃W3C//DTDXHTML1.0Transitional//EN&quot;&quot;http://www?w3?org/TR/xhtml1/DTD/xhtmll-transitional?dtd&quot;>3?<htmlxmlns=&quot;http://www?w3?org/1999/xhtml&quot;>4?<headrunat=&quot;server&quot;>5? 〈titled標題頁</title>6?</head>7?<body>8? <formid=&quot;form1&quot;runat=&quot;server&quot;>
10?11? <asp:TextBoxID=&quot;tb_name&quot;runat=&quot;server&quot;x/asp:TextBox>12.13? <asp:ButtonID=&quot;btn_post&quot;runat=&quot;server&quot;onclick=&quot;btn_post_Click&quot;Text=&quot;提交&quot;/>14.15.</div>16.</form>17.</body>18?</html>復制代碼Post.aspx.cs先擱下等寫好類庫再寫4.在Model實體類中新建一個user.cs的類1?usingSystem;2?usingSystem?Collections.Generic;3?usingSystem?Linq;4?usingSystem.Text;5?namespaceModel6?{7?publicclassuser8?{9?publicuser(){}10?privatestring_Name;11?publicstringName13set{_Name=value;}14get{return_Name;}13set{_Name=value;}14get{return_Name;}151617復制代碼在DAL新建userdb.cs,并引用Model層1?usingSystem;2?usingSystem?Collections.Generic;3? using System?Linq;4. using System.Text;5? using System.Data.SqlClient;6? using System?Configuration;7?namespaceDAL8?{9? publicclassuserdb10? {11? publicbooladduser(Model.usermodel)12? {13? SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[&quot;sqlconn&quot;]?ConnectionString);14? con.Open();15? using(SqlCommandcmd=newSqlCommand(&quot;INSERTINTOqzzm_user(Name)VALUES(@Name)&quot;,con))cmd?Parameters?AddWithValue(&quot;@Name&quot;,model.Name);if(cmd?ExecuteNonQuery()>0)returntrue;20? elsereturnfalse;TOC\o"1-5"\h\z}}}}復制代碼在BLL中新建userbll.cs并引用DAL,Model層1?usingSystem;2?usingSystem?Collections.Generic;3? using System?Linq;4. using System.Text;5? namespaceBLLTOC\o"1-5"\h\z6. {7? publicclassuserbll{DAL.userdbdb=newDAL?userdb();10? public booladduser(Model.usermodel)11? {12? returndb?adduser(model);13? }14? }15?}復制代碼7.可以開始寫Post.aspx.cs了1? usingSystem;usingSystem.Collections;4. using System.Data;5? using System?Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI?HtmlControls;10? using System.Web?UI?WebControls;11?usingSystem.Web?UI?WebControls.WebParts;12?usingSystem.Xml?Linq;13?publicpartialclassPost:System.Web?UI?Page14?{15? protected void Page_Load(object sender,EventArgse)16? {17? }18? protected voidbtn_post_Click(object sender,EventArgse)19?{20?Model.userus=newModel?user();21?us?Name=tb_name.Text;22?BLL.user
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南2024年12月云南省芒市2025年招考公益性崗位人員(第一批)筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 初中語文生活美文邱吉爾的選擇
- 2025年02月山東省屬事業(yè)單位公開招聘初級綜合類崗位人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 高中語文文摘校園紙飛機飛不出城市
- 連云港專版2024中考地理復習方案第三部分世界地理下第8課時日本東南亞強化訓練
- 課標版2025屆高考地理二輪復習考前主題練小題練六國家重點工程建設分析型
- 質(zhì)量管理體系與環(huán)境保護的雙重考慮
- 四年級數(shù)學上冊四混合運算與應用問題21應用問題三拔高習題無答案浙教版
- 山西專版2024年中考數(shù)學復習第二單元方程組與不等式組課時訓練05一次方程組及其應用
- 跨文化交際中的語言學習策略研究
- 油氣田開發(fā)專業(yè)危害因素辨識與風險防控
- 假肢安裝合同范本
- DB37-T4824-2025 鄉(xiāng)鎮(zhèn)(街道)應急物資配備指南
- 教育部人文社科 申請書
- 無菌手術臺鋪置的細節(jié)管理
- 《重大基礎設施項目涉及風景名勝區(qū)選址論證報告編制技術規(guī)范》編制說明
- 議論文8(試題+審題+范文+點評+素材)-2025年高考語文寫作復習
- 2025-2030年(全新版)中國軟冰淇淋市場發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025新人教版英語七年級下單詞默寫表(小學部分)
- 2024年大慶醫(yī)學高等??茖W校高職單招語文歷年參考題庫含答案解析
- 四川省綿陽市2025屆高三上學期第二次診斷性考試語文試題(含答案)
評論
0/150
提交評論