應(yīng)用程序框架實(shí)戰(zhàn)三十:表現(xiàn)層及ASP.NET MVC介紹(一)
本文將介紹表現(xiàn)層及ASP.NET MVC的一些要點(diǎn),特別是ASP.NET MVC的一些抽象和封裝技巧,如果你對(duì)MVC還不了解,可以參考《ASP.NET MVC4 高級(jí)編程》,作者Jon Galloway等,這本書由ASP.NET MVC團(tuán)隊(duì)成員編寫,相當(dāng)不錯(cuò)。
表現(xiàn)層的職責(zé)
表現(xiàn)層的職責(zé)是展示和收集數(shù)據(jù),將領(lǐng)域?qū)拥臄?shù)據(jù)和邏輯展示出來(lái),并收集用戶輸入的相關(guān)信息。
搞清楚表現(xiàn)層的職責(zé)以后,你就應(yīng)該清楚,表現(xiàn)層不是你應(yīng)該編寫業(yè)務(wù)邏輯的地方,這也是分層架構(gòu)的核心。
如果要展示一個(gè)計(jì)算值,不應(yīng)該在表現(xiàn)層直接完成計(jì)算,相反,由領(lǐng)域?qū)舆M(jìn)行計(jì)算,表現(xiàn)層直接拿到結(jié)果并展示,這樣可以讓表現(xiàn)層代碼非常簡(jiǎn)潔,同時(shí)業(yè)務(wù)邏輯被高度內(nèi)聚到領(lǐng)域?qū)印?/span>
很多時(shí)候,為了提升用戶體驗(yàn),我們會(huì)在頁(yè)面上使用Js進(jìn)行客戶端計(jì)算,從而獲得快速響應(yīng),但也導(dǎo)致業(yè)務(wù)邏輯泄露到Js中。在大多情況下,這是可以接受的,不過(guò)在你準(zhǔn)備用Js編寫這些重復(fù)邏輯時(shí),可以先考慮是否可以使用Ajax請(qǐng)求服務(wù)端完成。每當(dāng)你需要進(jìn)行客戶端實(shí)時(shí)計(jì)算時(shí),就發(fā)送請(qǐng)求給服務(wù)端,領(lǐng)域?qū)油瓿捎?jì)算,返回結(jié)果。
盡量減少業(yè)務(wù)邏輯副本,當(dāng)需求變化或發(fā)現(xiàn)BUG時(shí),代碼同步更輕松。
對(duì)于管理系統(tǒng)來(lái)說(shuō),盡量讓程序員少寫Js,盡量封裝和抽象,因?yàn)镴s是弱類型,沒(méi)有編譯時(shí)檢查,代碼提示很弱,哪怕使用了Resharper,代碼提示功能依然不佳,細(xì)長(zhǎng)的提示滾動(dòng)條,看得你兩眼直冒金星。另外Js很多技巧看上去很怪異,初學(xué)者使用這些技巧,Bug率將大幅上升。當(dāng)項(xiàng)目交給新人維護(hù),長(zhǎng)篇的Js更使其痛苦不堪。當(dāng)然這是給普通團(tuán)隊(duì)的建議,少寫Js可以讓你的項(xiàng)目容易維護(hù),高水平團(tuán)隊(duì)請(qǐng)忽視。
Mvc介紹
MVC是一個(gè)表現(xiàn)層架構(gòu)模式,將表現(xiàn)層分成三個(gè)部分,模型、視圖和控制器。
當(dāng)Http請(qǐng)求發(fā)送到ASP.NET MVC引擎時(shí),MVC引擎查找路由表以決定由哪個(gè)控制器操作來(lái)處理這個(gè)請(qǐng)求。
控制器是一個(gè)指揮中心,它調(diào)用后端的服務(wù),并將得到的模型交給視圖顯示。
你可以直接在控制器方法中操作DbContext或倉(cāng)儲(chǔ),并使用Linq語(yǔ)句進(jìn)行查詢。當(dāng)你逐步意識(shí)到控制器代碼變得復(fù)雜時(shí),可以創(chuàng)建應(yīng)用層服務(wù)來(lái)簡(jiǎn)化表現(xiàn)層。
應(yīng)用服務(wù)為表現(xiàn)層提供唯一的API訪問(wèn)點(diǎn),大幅降低控制器復(fù)雜度,控制器的所有操作,都通過(guò)應(yīng)用服務(wù)一個(gè)明確的API完成,不僅操作更規(guī)范,而且控制器將變成很薄的一層。
控制器的開(kāi)發(fā)要點(diǎn)是,保持盡量簡(jiǎn)單,沒(méi)事少寫代碼。把你的需求交給應(yīng)用層服務(wù)去實(shí)現(xiàn),你只需要簡(jiǎn)單調(diào)用其接口就行了。
模型是指數(shù)據(jù)與業(yè)務(wù)邏輯,即領(lǐng)域模型,大部分時(shí)候,你可以在MVC視圖中直接操作領(lǐng)域?qū)嶓w,視圖模型ViewModel不是必須的。不過(guò)出于某些原因考慮,視圖中操作的也可能是DTO或ViewModel,當(dāng)界面變得復(fù)雜時(shí),通過(guò)為特定視圖引入專門的ViewModel 可以簡(jiǎn)化界面開(kāi)發(fā)。
你可能已經(jīng)發(fā)現(xiàn)了名目繁多的實(shí)體類型:領(lǐng)域?qū)嶓w、DTO、ViewModel、查詢實(shí)體等,確實(shí)讓人眼花繚亂,我將在后續(xù)用專文討論,以方便你根據(jù)需要取舍。
約定優(yōu)于配置
“約定優(yōu)于配置”原則,建議你盡量遵循默認(rèn)約定,并形成習(xí)慣,這樣可以大幅降低學(xué)習(xí)成本和工作量,同時(shí)獲得更一致的目錄結(jié)構(gòu)和代碼風(fēng)格,查找特定類型的文件變得非常容易,可維護(hù)性大大提高了,你僅在必要時(shí)才需要通過(guò)配置來(lái)覆蓋默認(rèn)值。
“約定優(yōu)于配置”原則對(duì)目錄結(jié)構(gòu)和命名產(chǎn)生了深遠(yuǎn)影響。
項(xiàng)目的目錄結(jié)構(gòu)至關(guān)重要,但大部分程序員對(duì)目錄結(jié)構(gòu)不太關(guān)心,因?yàn)閯?chuàng)建文件夾沒(méi)有技術(shù)含量,簡(jiǎn)單的容易被忽視。
當(dāng)你準(zhǔn)備修改某個(gè)功能時(shí),第一步起碼先得找到相關(guān)的文件。
如果你平時(shí)不太注意目錄結(jié)構(gòu)的管理,創(chuàng)建文件很隨意,隨便找個(gè)地方就扔進(jìn)去了,隨著項(xiàng)目文件的增多,你的開(kāi)發(fā)工作將會(huì)越來(lái)越亂,當(dāng)你要找某個(gè)文件時(shí),你會(huì)在目錄樹中四處亂點(diǎn),“哦,不在這,哦,也不在那,哦耶,終于找到了”。
當(dāng)你要找一個(gè)控制器時(shí),你會(huì)去查找Controllers目錄,而不是一個(gè)叫ABCD的目錄,這就是命名約定。如果存在一個(gè)名為TestController的控制器,默認(rèn)在Views目錄中就會(huì)有一個(gè)Test的目錄與之對(duì)應(yīng),這樣在查找控制器對(duì)應(yīng)的視圖時(shí)就能非常輕松。
當(dāng)你的所有文件都能夠根據(jù)約定,分門別類的放到清晰命名的目錄中時(shí),整個(gè)項(xiàng)目的質(zhì)量將大幅提升。
我在封裝EasyUi時(shí),把控件Id的命名作了一些約定,比如表格叫g(shù)rid。這樣很多Js回調(diào)函數(shù),就可以在內(nèi)部完成,不需要你手工處理了,如果你遵循這些約定,開(kāi)發(fā)一個(gè)簡(jiǎn)單的EasyUi CRUD操作,基本不需要寫Js。
.Net應(yīng)用程序框架交流QQ群: 386092459,歡迎有興趣的朋友加入討論。
謝謝大家的持續(xù)關(guān)注,我的博客地址:http://www.rzrgm.cn/xiadao521/

浙公網(wǎng)安備 33010602011771號(hào)