應用程序框架實戰三十:表現層及ASP.NET MVC介紹(一)


  本文將介紹表現層及ASP.NET MVC的一些要點,特別是ASP.NET MVC的一些抽象和封裝技巧,如果你對MVC還不了解,可以參考《ASP.NET MVC4 高級編程》,作者Jon Galloway等,這本書由ASP.NET MVC團隊成員編寫,相當不錯。

表現層的職責

  表現層的職責是展示和收集數據,將領域層的數據和邏輯展示出來,並收集用戶輸入的相關信息。

  搞清楚表現層的職責以后,你就應該清楚,表現層不是你應該編寫業務邏輯的地方,這也是分層架構的核心。

  如果要展示一個計算值,不應該在表現層直接完成計算,相反,由領域層進行計算,表現層直接拿到結果並展示,這樣可以讓表現層代碼非常簡潔,同時業務邏輯被高度內聚到領域層。

  很多時候,為了提升用戶體驗,我們會在頁面上使用Js進行客戶端計算,從而獲得快速響應,但也導致業務邏輯泄露到Js中。在大多情況下,這是可以接受的,不過在你准備用Js編寫這些重復邏輯時,可以先考慮是否可以使用Ajax請求服務端完成。每當你需要進行客戶端實時計算時,就發送請求給服務端,領域層完成計算,返回結果。

  盡量減少業務邏輯副本,當需求變化或發現BUG時,代碼同步更輕松。

  對於管理系統來說,盡量讓程序員少寫Js,盡量封裝和抽象,因為Js是弱類型,沒有編譯時檢查,代碼提示很弱,哪怕使用了Resharper,代碼提示功能依然不佳,細長的提示滾動條,看得你兩眼直冒金星。另外Js很多技巧看上去很怪異,初學者使用這些技巧,Bug率將大幅上升。當項目交給新人維護,長篇的Js更使其痛苦不堪。當然這是給普通團隊的建議,少寫Js可以讓你的項目容易維護,高水平團隊請忽視。

Mvc介紹

  MVC是一個表現層架構模式,將表現層分成三個部分,模型、視圖和控制器。

  當Http請求發送到ASP.NET MVC引擎時,MVC引擎查找路由表以決定由哪個控制器操作來處理這個請求。

  控制器是一個指揮中心,它調用后端的服務,並將得到的模型交給視圖顯示。

  你可以直接在控制器方法中操作DbContext或倉儲,並使用Linq語句進行查詢。當你逐步意識到控制器代碼變得復雜時,可以創建應用層服務來簡化表現層。

  應用服務為表現層提供唯一的API訪問點,大幅降低控制器復雜度,控制器的所有操作,都通過應用服務一個明確的API完成,不僅操作更規范,而且控制器將變成很薄的一層。

  控制器的開發要點是,保持盡量簡單,沒事少寫代碼。把你的需求交給應用層服務去實現,你只需要簡單調用其接口就行了。

  模型是指數據與業務邏輯,即領域模型,大部分時候,你可以在MVC視圖中直接操作領域實體,視圖模型ViewModel不是必須的。不過出於某些原因考慮,視圖中操作的也可能是DTO或ViewModel,當界面變得復雜時,通過為特定視圖引入專門的ViewModel 可以簡化界面開發。

  你可能已經發現了名目繁多的實體類型:領域實體、DTO、ViewModel、查詢實體等,確實讓人眼花繚亂,我將在后續用專文討論,以方便你根據需要取舍。

約定優於配置

  “約定優於配置”原則,建議你盡量遵循默認約定,並形成習慣,這樣可以大幅降低學習成本和工作量,同時獲得更一致的目錄結構和代碼風格,查找特定類型的文件變得非常容易,可維護性大大提高了,你僅在必要時才需要通過配置來覆蓋默認值。

  “約定優於配置”原則對目錄結構和命名產生了深遠影響。

  項目的目錄結構至關重要,但大部分程序員對目錄結構不太關心,因為創建文件夾沒有技術含量,簡單的容易被忽視。

  當你准備修改某個功能時,第一步起碼先得找到相關的文件。

  如果你平時不太注意目錄結構的管理,創建文件很隨意,隨便找個地方就扔進去了,隨着項目文件的增多,你的開發工作將會越來越亂,當你要找某個文件時,你會在目錄樹中四處亂點,“哦,不在這,哦,也不在那,哦耶,終於找到了”。

  當你要找一個控制器時,你會去查找Controllers目錄,而不是一個叫ABCD的目錄,這就是命名約定。如果存在一個名為TestController的控制器,默認在Views目錄中就會有一個Test的目錄與之對應,這樣在查找控制器對應的視圖時就能非常輕松。

  當你的所有文件都能夠根據約定,分門別類的放到清晰命名的目錄中時,整個項目的質量將大幅提升。

  我在封裝EasyUi時,把控件Id的命名作了一些約定,比如表格叫grid。這樣很多Js回調函數,就可以在內部完成,不需要你手工處理了,如果你遵循這些約定,開發一個簡單的EasyUi CRUD操作,基本不需要寫Js。

 

  .Net應用程序框架交流QQ群: 386092459,歡迎有興趣的朋友加入討論。

  謝謝大家的持續關注,我的博客地址:http://www.cnblogs.com/xiadao521/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM