1. 程式人生 > >應用程式框架實戰三十:表現層及ASP.NET MVC介紹(一)

應用程式框架實戰三十:表現層及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/