西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)C#.NET → 使用View Model從表現(xiàn)層分離領(lǐng)域模型

使用View Model從表現(xiàn)層分離領(lǐng)域模型

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:Shanyou時間:2010/4/3 23:40:28字體大小:A-A+

作者:佚名點擊:168次評論:1次標簽: 表現(xiàn)層

  • 類型:圖像瀏覽大。13.0M語言:英文 評分:3.6
  • 標簽:
立即下載

Model-View-Controller(模型-視圖-控制器,MVC) 模式將你的軟件組織并分解成三個截然不同的角色:

Model 封裝了你的應(yīng)用數(shù)據(jù)、應(yīng)用流程和業(yè)務(wù)邏輯。

View 從 Model 獲取數(shù)據(jù)并格式化數(shù)據(jù)以進行顯示。

Controller 控制程序流程,接收輸入,并把它們傳遞給 Model 和 View。

與其它設(shè)計模式不同,MVC 模式并沒有直接反映一個你能夠編寫或配置的類結(jié)構(gòu)。相反,MVC 更像一個概念上的指導(dǎo)原則或范型。概念上的 MVC 模式被描述為三個對象 —— Model、View 和 Controller —— 之間的關(guān)系。由于 View 和 Controller 都可以從 Model 請求數(shù)據(jù),所以 Controller 和 View 都依賴 Model。任何輸入都通過 Controller 進入你的系統(tǒng),然后 Controller 選擇一個 View 來發(fā)出結(jié)果。

Model 包含了你的應(yīng)用邏輯和數(shù)據(jù),在你的應(yīng)用程序中,它很可能是主要的值驅(qū)動器。Model 沒有任何與表現(xiàn)層相關(guān)的特性,而且也和 HTTP 請求處理職責(zé)中完全無關(guān)。

Domain Model 是一個對象層,是對現(xiàn)實世界邏輯、數(shù)據(jù)和你應(yīng)用程序所處理的問題的抽象。Domain Model 可分為兩大類:Simple Domain Model 和 Rich Domain Model。

Simple Domain Model 往往是業(yè)務(wù)對象和數(shù)據(jù)庫表之間一對一的通信。你已經(jīng)見過的幾種模式 —— Active Record、Table Data Gateway,以及 Data Mapper,所有這些與數(shù)據(jù)庫相關(guān)的設(shè)計模式 —— 可以幫助你把與數(shù)據(jù)庫相關(guān)的邏輯組織成一個 Domain Model。

Rich Domain Model 包含復(fù)雜的,使用繼承機制緊密聯(lián)系在一起的對象網(wǎng)絡(luò),在本書和 GoF 一書中介紹的眾多模式起著杠桿作用。Rich Domain Models 往往是柔性的,精心測試過的,不斷重構(gòu)的,而且與它們所表達的領(lǐng)域所需的業(yè)務(wù)邏輯緊密耦合。

采用哪種 Domain Model 類型取決于你的應(yīng)用環(huán)境。如果你正在建立的是一個非常簡單的表單處理 web 應(yīng)用,沒必要建立 Rich Domain Model。然而,如果你正在編寫一個價值數(shù)百萬的企業(yè)內(nèi)聯(lián)網(wǎng)架構(gòu)的核心庫,那么努力開發(fā)一個 Rich Domain Model 就是值得的,它可以為你提供一個準確表達業(yè)務(wù)過程的平臺,并可以讓你快速傳輸數(shù)據(jù)。

Martin Fowler 在 PoEAA 中同時簡要介紹了兩種 Domain Model。而 Eric Evans 的 Domain Driven Design 一書,則完全專注于 Rich Domain Model 的實踐應(yīng)用和開發(fā)過程。

View 用于處理所有表現(xiàn)層方面的問題。View 從 Model 獲取數(shù)據(jù),并可以把它格式化成用于 web 頁的 HTML,用于 web 服務(wù)的 XML,或用于 email 的文本。

許多的MVC模式的實現(xiàn)也都使用一個View Model或Application Model的概念,Controller是溝通的媒介,架起領(lǐng)域模型和用戶界面之間的橋梁,屬于表現(xiàn)層。為了View的簡單性,Controller負責(zé)處理或者將領(lǐng)域模型轉(zhuǎn)換成一個View Model,這通常叫做數(shù)據(jù)傳輸對象(DTO)。

<譯>12個asp.net MVC最佳實踐針對Model的最佳實踐有這么一段:

7–DomainModel != ViewModel
DomainModel代表著相應(yīng)的域,但ViewModel卻是為View的需要而創(chuàng)建。這兩者之間或許(一般情況下都)是不同的,此外DomainModel是數(shù)據(jù)加上行為的組合體,是由復(fù)雜的變量類型組成的并且具有層次。而ViewModel只是由一些String等簡單變量類型組成。如果想移除冗余并且容易導(dǎo)致出錯的ORM代碼,可以使用AutoMapper.如果想要了解更多,我推薦閱讀:ASP.NET MVC View Model Patterns.

那么領(lǐng)域模型(Domain Model )和視圖模型(View Model)有什么不同呢?

在ASP.NET MVC的應(yīng)用程序中經(jīng)常可以可以看到View Model,經(jīng)常我們都認為領(lǐng)域模型和視圖模型是同一個東西。這特別是把領(lǐng)域模型包含在數(shù)據(jù)傳輸對象DTO里的時候,例如使用Entity Framework之類的ORM工具生成的實體。在這種情況下,領(lǐng)域模型和視圖模型包含的實體非常相似,都是一些簡單的CRUD操作。

這些實體有許多屬性,有相同或類似的名稱,你可以很容易地映射領(lǐng)域?qū)嶓w對應(yīng)視圖模型中的一個屬性。不過,這些相似的屬性也可能略有不同,例如類型或者格式。例如,用戶填寫的用戶界面的一個屬性,他在視圖模型里可能是一個“Nullable”的。另一方面,領(lǐng)域?qū)嶓w可能需要一個經(jīng)過驗證的合法的值,所以需要一個在用戶界面的領(lǐng)域模型之間的轉(zhuǎn)換。另一個例子是,用戶界面可能會顯示一個滑塊,用于用戶選擇多少天以后提交他的訂單。在這種情況下,視圖模型可能使用一個整數(shù)屬性來表示,領(lǐng)域模型通常是一個日期值。

視圖模型通常只包含領(lǐng)域模型的一個子集,而且只包含界面上所需要的屬性。此外,視圖模型可能是一個領(lǐng)域模型樹的扁平版本,例如,一個Customer實體有一個Address,而這又是一個整體,它包含街道地址,郵政編碼,國家等。一個Customer 視圖模型用于顯示數(shù)據(jù),將地址數(shù)據(jù)拉平填充到視圖模型類里。

此外如果一個View需要同時處理幾個領(lǐng)域模型,View Model就是這幾個Domain Model的總和。領(lǐng)域模型和視圖模型之間有很多相似的地方,我們經(jīng)常干脆就把Domain Model當作View Model來使用了。

上面討論了領(lǐng)域模型和視圖模型的相似性,我們來看看都有幾種方式把領(lǐng)域模型轉(zhuǎn)換為視圖模型,通常有3種方法:

把領(lǐng)域模型當作視圖模型來用,也就是領(lǐng)域模型就是視圖模型,大部分都是這么用的。
視圖模型里面包含一個領(lǐng)域模型,定義一個視圖模型,里面包含了一個領(lǐng)域模型,通過屬性方式進行訪問。
將領(lǐng)域模型映射到視圖模型,領(lǐng)域模型并沒有直接映射到視圖模型,需要處理這種映射關(guān)系。
我們不建議直接把領(lǐng)域模型實體暴露給視圖,因為有許多細微之處,可能導(dǎo)致您混合業(yè)務(wù)和表示層的邏輯,無論是領(lǐng)域?qū)嶓w的屬性顯示還是業(yè)務(wù)的驗證規(guī)則,這都是應(yīng)用程序處理的不同方面。直接將你的領(lǐng)域模型作為Conroller上的處理參數(shù)面臨著安全風(fēng)險,因為Controller或者Model binder必須確保屬性驗證和用戶不能修改她自己不能修改的屬性(例如,用戶手動更新了一個隱藏的輸入值,或增加一個額外的屬性值,而這個并不是界面上的元素,但卻正好領(lǐng)域模型實體的屬性,這種風(fēng)險叫做“over-posting”),即使對當前版本的領(lǐng)域模型做了正確的驗證,領(lǐng)域模型將來可能做了變更修改,并沒有出現(xiàn)編譯錯誤或者警告,可能導(dǎo)致新的風(fēng)險。

我們應(yīng)當避免使用前兩種方法將領(lǐng)域模型轉(zhuǎn)換成視圖模型,推薦使用第三種方法,定義單獨的視圖模型類。做這種領(lǐng)域模型到視圖模型的轉(zhuǎn)換工作是一種重復(fù)性的工作,已經(jīng)有幾個工具可以幫助你來完成這項工作。最常用的一個工具就是.NET 社區(qū)的開源項目AutoMapper。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)