ASP.NET MVC與三層架構(gòu)

共同理念:將視圖設(shè)計與數(shù)據(jù)持久化分離,降低耦合度,易于擴展,提升開發(fā)效率。

很多人誤以為MVC就是以往使用的三層體系結(jié)構(gòu)(3-Tier)雁刷,其實兩者是不同的。一般而言保礼,三層體系結(jié)構(gòu)分為表示層(Presentation)沛励、商業(yè)邏輯層(Business Logic)、數(shù)據(jù)訪問層(Data Access)炮障。MVC三部分并不能直接對應(yīng)這所謂的三層體系結(jié)構(gòu)目派。

三層架構(gòu)

三層架構(gòu)

三層架構(gòu)(3-Tier Application)是一種軟件抽象的層次結(jié)構(gòu),是對復(fù)雜系統(tǒng)的一種縱向切分铝阐,每一層中完成同一類型的操作址貌,將各種代碼一起完成的使命作為依據(jù)來分割,以降低復(fù)雜度徘键,提供可維護性练对。

一般來說,層次之間是向下依賴的吹害,下層在未確定接口(契約)規(guī)范前螟凭,上層代碼無法開發(fā),下層代碼接口的變化將使上層一起變化它呀。

為實現(xiàn)“高內(nèi)聚螺男,低耦合”棒厘,將整個業(yè)務(wù)應(yīng)用劃分為三層,其目的是為了解耦下隧。

  • 界面層(UI, User Interface Layer)
    主要是與用戶交互的界面奢人,用于接收用戶輸入的數(shù)據(jù)和顯示處理后的數(shù)據(jù)。
    如果邏輯層相當(dāng)強大和完善淆院,無論表現(xiàn)層如何定義和修改何乎,邏輯層都能完善的提供服務(wù)。
  • 業(yè)務(wù)邏輯層(BLL, Business Logic Layer)
    UI與DAL之間的橋梁土辩,實現(xiàn)業(yè)務(wù)邏輯支救,主要包括驗證、計算拷淘、規(guī)則等各墨。
  • 數(shù)據(jù)訪問層(DAL, Data Access Layer)
    與數(shù)據(jù)庫交互,實現(xiàn)對數(shù)據(jù)的CURD启涯,將存儲在數(shù)據(jù)庫中的數(shù)據(jù)提交給業(yè)務(wù)層贬堵,同時將業(yè)務(wù)層處理的數(shù)據(jù)保存到數(shù)據(jù)庫。

三層架構(gòu)是一個分層式的軟件體系架構(gòu)設(shè)計结洼,可適用于任何項目扁瓢。架構(gòu)設(shè)計是用來指導(dǎo)軟件、系統(tǒng)等各個方面的設(shè)計补君。MVC作為一種設(shè)計范式,是根據(jù)項目具體需求來決定是否適用昧互。設(shè)計模式(Design Pattern)是指一套被反復(fù)使用挽铁,多人知曉,經(jīng)過分類的敞掘,代碼設(shè)計經(jīng)驗的總結(jié)叽掘。使用設(shè)計模式的目的是為了代碼的可重用性,讓代碼更容易被他人理解玖雁,并能保證代碼的可靠性更扁。

具體而言,三層架構(gòu)是為了解決整個應(yīng)用程序中各個業(yè)務(wù)操作過程中的不同階段的代碼封裝問題赫冬,為了使程序員更加專注的處理某階段的業(yè)務(wù)邏輯浓镜。比如,將數(shù)據(jù)庫操作代碼封裝到一層劲厌,提供方法根據(jù)參數(shù)直接返回用戶所需的數(shù)據(jù)膛薛。這樣,在處理具體的業(yè)務(wù)邏輯的時候补鼻,就無需關(guān)心數(shù)據(jù)的存儲問題了哄啄。

MVC

MVC是Model-View-Controller雅任,MVC把三層架構(gòu)中的UI層再度分割形成模型、視圖咨跌、控制器沪么。控制器完成頁面邏輯锌半、通過模型與界面通信禽车,控制器則直接與三層架構(gòu)中的業(yè)務(wù)邏輯層BLL對話。

MVC是一種復(fù)合設(shè)計范式拳喻,一種在特定場合用于解決某種實際問題得出的可以反復(fù)實踐的解決方案哭当。首先MVC中三者并不存在明顯的層次結(jié)構(gòu),沒有明顯的向下依賴的關(guān)系冗澈。相反的是View和Model往往是比較獨立的钦勘,而Controller則是兩者的橋梁。

MVC更像是橫向的切分亚亲,MVC每塊都可以獨立測試彻采。而在三層架構(gòu)中,上層模塊的運行測試勢必要提供下層代碼或相同接口捌归。MVC的目的是實現(xiàn)Web系統(tǒng)(BS結(jié)構(gòu))的職能分工肛响,即職責(zé)劃分。

MVC生命周期
ASP.NET MVC生命周期

數(shù)據(jù)模型

MVC中每塊內(nèi)部惜索,特別是Model特笋,經(jīng)常被設(shè)計為多層的。

數(shù)據(jù)模型Model用于封裝與應(yīng)用程序在商業(yè)邏輯上相關(guān)的數(shù)據(jù)巾兆,以及對其數(shù)據(jù)操作的處理方法猎物。

  • 數(shù)據(jù)結(jié)構(gòu)的定義
  • 數(shù)據(jù)格式的驗證
  • 數(shù)據(jù)庫的訪問操作,包括CURD角塑。

數(shù)據(jù)模型Model并不依賴于Controller和View蔫磨, 也就是說Model無需知道它將如何顯示或如何被應(yīng)用,僅需專注于做好數(shù)據(jù)庫訪問圃伶、定義堤如、驗證的責(zé)任即可。

ASP.NET 中 Model 常用的技術(shù)

  • EF:Entity Framework
  • NHibernate
  • LINQ to SQL
  • 強類型的DataSet(Typed DataSet)
  • ADO.NET

ASP.NET MVC推薦使用強類型的方式設(shè)計Model窒朋,才可以有效地利用內(nèi)建的模型綁定(Model Binding)與模型驗證機制搀罢。

控制器

MVC中控制器的協(xié)調(diào)者角色

Controller的角色介于用戶接口層和商業(yè)邏輯層之間,屬于分水嶺的角色侥猩。

在項目初期設(shè)計時魄揉,建議將用戶接口層和商業(yè)邏輯層明確地分離開,后續(xù)開發(fā)商會比較順手拭宁。

ASP.NET MVC

ASP.NET MVC是微軟發(fā)布的網(wǎng)站開發(fā)架構(gòu)洛退,為了解決傳統(tǒng)ASP.NET開發(fā)中不能分離MVC而設(shè)計瓣俯。

MVC中頁面代碼并不與后臺對應(yīng),而是分別存放在Controller和View中兵怯。

MVC可讓開發(fā)者分割出不同方面的應(yīng)用程序(輸入邏輯彩匕、商業(yè)邏輯、顯示邏輯)媒区,并在這些分割出來的應(yīng)用程序中提供松散的關(guān)聯(lián)驼仪。

關(guān)注點分離

關(guān)注點分離(Separation of Concerns, SOC)是AOP(Aspect-Oriented Programming, 面向切面編程)中的概念袜漩。AOP是面向側(cè)面的程序設(shè)計或面向方面的程序設(shè)計绪爸,是對面向?qū)ο蟪绦蛟O(shè)計的改進和擴展。

SOC是ASP.NET MVC開發(fā)中很重要的原則宙攻,簡單來說就是“只注意需要注意的”奠货。這是處理復(fù)雜邏輯的原則,因為將太多個關(guān)注點湊在一起座掘,勢必造成復(fù)雜度的大幅增加递惋,處理復(fù)雜邏輯時若能將關(guān)注點分離開來各個擊破,相對來說會比全部一起處理要容易溢陪。

當(dāng)一件事情被細分為各個單元后萍虽,各個單元的復(fù)雜度將相對降低,復(fù)雜度降低后問題就更容易理解形真,理解后當(dāng)然就更容易開發(fā)杉编。

約定優(yōu)于配置

ASP.NET MVC中使用了約定優(yōu)于配置(Convention over Configuration)的軟件設(shè)計原則來規(guī)范這種共同約定。約定優(yōu)于配置的概念簡單來說咆霜,就是利用約定(Convention)來取代復(fù)雜的配置(Configuration)王财。

例如:

  • Controller文件名后要緊跟Controller
  • View要放置到Views目錄中
  • View的名稱要對應(yīng)Controller的Action名稱
  • WebAPI的Action名稱要添加HTTP動詞
    ...

三層架構(gòu) + MVC

三層架構(gòu)MVC
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裕便,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌见咒,老刑警劉巖偿衰,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異改览,居然都是意外死亡下翎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門宝当,熙熙樓的掌柜王于貴愁眉苦臉地迎上來视事,“玉大人,你說我怎么就攤上這事庆揩±” “怎么了跌穗?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虏辫。 經(jīng)常有香客問我蚌吸,道長,這世上最難降的妖魔是什么砌庄? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任羹唠,我火速辦了婚禮,結(jié)果婚禮上娄昆,老公的妹妹穿的比我還像新娘佩微。我一直安慰自己,他們只是感情好萌焰,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布哺眯。 她就那樣靜靜地躺著,像睡著了一般杆怕。 火紅的嫁衣襯著肌膚如雪族购。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天陵珍,我揣著相機與錄音寝杖,去河邊找鬼。 笑死互纯,一個胖子當(dāng)著我的面吹牛瑟幕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播留潦,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼只盹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兔院?” 一聲冷哼從身側(cè)響起殖卑,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坊萝,沒想到半個月后孵稽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡十偶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年菩鲜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惦积。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡接校,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狮崩,到底是詐尸還是另有隱情蛛勉,我是刑警寧澤鹿寻,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站董习,受9級特大地震影響烈和,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皿淋,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一招刹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窝趣,春花似錦疯暑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洗鸵,卻和暖如春越锈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膘滨。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工甘凭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人火邓。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓丹弱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铲咨。 傳聞我的和親對象是個殘疾皇子躲胳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 又看到有人在問三層架構(gòu)和MVC的關(guān)系,感覺這種問題有點教條化了纤勒。因為它們都在邏輯上將應(yīng)用程序劃為三塊坯苹,湊了一個數(shù)字...
    Ludiwgbet閱讀 1,890評論 1 12
  • ASP.NET MVC 是一個全新的Web應(yīng)用框架 ASP.NET 代表支撐應(yīng)用框架的技術(shù)平臺,表明ASP.NET...
    JunChow520閱讀 1,246評論 0 1
  • 三層架構(gòu)和MVC 三層架構(gòu) (3-tier application) 是將整個業(yè)務(wù)應(yīng)用劃分為:表現(xiàn)層(UI)摇天、業(yè)務(wù)...
    hnscdg閱讀 1,778評論 0 8
  • 本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- B...
    圣杰閱讀 12,837評論 12 139
  • 1. 白板: 白板可以有很多類型粹湃,我們可以把身邊的墻面柜面等很多東西做成白板,一邊隨時隨地思考記錄闸翅。 2. 移動辦...
    王炳煒閱讀 183評論 0 0