共同理念:將視圖設(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)(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é)劃分。
數(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)與模型驗證機制搀罢。
控制器
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動詞
...