本文地址:http://www.cnblogs.com/outtamyhead/archive/2013/04/08/3007234.html ,轉載需保留本地址。
說在前面:
1、由於是頭次翻譯整本書籍,所以錯誤難免,希望大家都提出來,翻譯的不好還望大家少拍磚多鼓勵。
2、該系列沒有按照原文直譯,而是加入了我的一些言語在里面(在沒有改變原意的情況下),所以大家在看的時候希望有所對照。
3、該系列每周出一或二篇博客,因為我最近很忙,一直在加班,很累的說。
4、該系列不提供原版文字,希望看原版的可以自行下載Pdf。
5、該系列省去了前面的廢話,單刀直入,講主體內容。
第三章:MVC模式(一)
在第7章,我們打算創建一個比較復雜的ASP.NET MVC示例。在開始挖掘更多MVC框架詳細功能之前,我們希望你能大致熟悉MVC設計模式,並以它的方式進行思考。在本章,我們將描述下述內容:
MVC架構模式
域模型和數據倉庫
用依賴注入(DI)創建松耦合系統
自動測試基礎
你可能已經熟悉了本章描述的一些想法和規范,尤其是如果你完成過高級ASP.NET開發或者C#開發。如果沒有,我們希望你能認真的閱讀本章內容--很好的理解MVC背后的事情,有助於在閱讀本書的過程中,把這個框架的特性放到相關的語境中。
MVC歷史
略
理解MVC模式
在高級層面來說,MVC模式意味着MVC應用程序至少會被分為3部分:
Models:包含或者描述用戶使用的數據。這些可以是簡單的視圖模型,它只描述在視圖和控制器之間傳遞的數據;或者它們可以是主域模型,它包含在業務方面的數據以及處理這些數據的操作、轉換、和規則。
Views:被用在渲染模型的某些部分作為用戶界面。
Controllers:它處理傳入的請求,在模型上執行操作,並選擇和渲染要展現給用戶的視圖。
模型是你用來工作的應用程序世界的定義。例如,在一個銀行項目中,模型描述了應用程序支持的銀行的任何東西,如賬號、總賬、客戶的的信用額度--以及那些可以用來操作模型數據的操作,像存入資金,從賬戶提款。模型也負責保存全局狀態和數據的一致性--例如,確保所有交易添加在分賬中,客戶沒有提取超過他存入銀行數額上限的錢。
理解域模型
MVC程序中最重要的部分是域模型。我們通過存在於工業或活動中的真實世界的對象、操作和規則來創建模型並且我們的程序必須支持,這就是域。
隨后我們創建這個域的軟件標識--域模型。為了我們的目的,這個域模型是一組C#類型(類,結構,等),統稱為域類型。域中的操作由定義為域類型的方法標識,而域規則則由這些方法里的邏輯來標識--或者,如我們在前面章節看到的,通過在方法上添加C#特性來標識。當我們創建一個域類型的實例來描述特定數據,我們就創建了一個域對象。域模型通常是保持的並長期活動的--這有很多種不同的方式來實現,但是關系型數據庫是最常用的選擇。
簡言之,域模型是程序中業務數據和數據處理唯一權威的定義。一個保持的域模型也是域表現狀態的權威定義 。
域模型的方法解決了許多智能UI模式中出現的問題.我們的邏輯方法只包含在一個地方--如果你需要操作模型里的數據或者添加一個新的過程或者規則,域模型是你應用程序中唯一變化的部分。
提示:從一個ASP.NET MVC應用程序的其余部分分離域模型的一種常見方式是把模型放在單獨的C#程序集中。用這種方式,你可以從程序的其他部分創建對域模型的引用,但是要確保沒有在其他方向進行引用。這在大規模的項目中十分有用。我們會在第7章的示例中使用這種方式。
模型也可以由不是它們負責的內容來定義:模型不涉及渲染UI和處理請求--那些是視圖和控制器的職責。視圖包含模型元素要顯示給用戶的邏輯--其它什么都沒有。它們並不直接的感知模型並且不直接與模型進行通信。控制器則是視圖和模型的溝通橋梁--來自客戶端的請求由控制器提供服務,選擇合適的視圖展現給用戶,並且,如果需要,執行模型上的相應操作。
MVC架構的每一部分都是明確定義和自包含的--這叫做關系分離。模型數據的邏輯操作只包含在模型中;展現數據的邏輯只包含在視圖中並且處理用戶請求和輸入的代碼只包含在控制器中。每一部分的彼此都有清晰的區分,你的應用程序會很容易維護和擴展,無論它會變多大。
ASP.NET MVC 的實現
在MVC中,控制器是C#類,通常源自System.Web.Mvc.Controller類。類里的每一個源自Controller類的Public方法都被稱作動作方法,它與一個通過ASP.NET 路由系統可配置的URL相關聯。當一個請求發送到一個與動作方法相關聯的URL時,控制器類的相應代碼塊就會被執行以完成在域模型上的一些操作然后選擇一個視圖展現在客戶端。圖3-1說明了控制器、模型和視圖之間的交互。
MVC框架為視圖引擎的選擇提供支持。MVC的早起版本使用標准的ASP.NET視圖引擎,通過使用Web窗體標記語言的精簡版來處理ASPX頁面。MVC3引入了Razor視圖引擎,並在MVC4中得到細化並且使用了完全不同的語法(在第5章會介紹)。Visual Studio提供智能感應支持對這兩個視圖引擎,使得把控制器提供的數據注入到視圖和對視圖進行響應成為一件簡單的事。
MVC沒有在實現你的域模型時添加任何約束。你可以用規則的C#對象生成一個模型並可以用任何數據庫、ORM框架、或者.NET支持的其他數據工具來實現保持。Visual Studio創建了一個Models文件夾作為MVC項目模板的一部分。這對簡單的項目很合適,但是更復雜的程序傾向在單獨的項目中定義他們的域模型。我們會在本章的后面討論域模型的實現。