天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

使用View Model從表現層分離領域模型

      MVC架構模式是近年來編程世界里最長被提及的模式之一,Model-View-Controller(模型-視圖-控制器,MVC) 模式將你的軟件組織并分解成三個截然不同的角色:

  • Model 封裝了你的應用數據、應用流程和業務邏輯。

  • View 從 Model 獲取數據并格式化數據以進行顯示。

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

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

Model 包含了你的應用邏輯和數據,在你的應用程序中,它很可能是主要的值驅動器。Model 沒有任何與表現層相關的特性,而且也和 HTTP 請求處理職責中完全無關。

      Domain Model 是一個對象層,是對現實世界邏輯、數據和你應用程序所處理的問題的抽象。Domain Model 可分為兩大類:Simple Domain Model 和 Rich Domain Model。

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

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

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

      Martin Fowler 在 PoEAA 中同時簡要介紹了兩種 Domain Model。而 Eric Evans 的 Domain Driven Design 一書,則完全專注于 Rich Domain Model 的實踐應用和開發過程。View 用于處理所有表現層方面的問題。View 從 Model 獲取數據,并可以把它格式化成用于 web 頁的 HTML,用于 web 服務的 XML,或用于 email 的文本。

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

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

7–DomainModel != ViewModel

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

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

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

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

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

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

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

  1. 把領域模型當作視圖模型來用,也就是領域模型就是視圖模型,大部分都是這么用的。
  2. 視圖模型里面包含一個領域模型,定義一個視圖模型,里面包含了一個領域模型,通過屬性方式進行訪問。
  3. 將領域模型映射到視圖模型,領域模型并沒有直接映射到視圖模型,需要處理這種映射關系。

      我們不建議直接把領域模型實體暴露給視圖,因為有許多細微之處,可能導致您混合業務和表示層的邏輯,無論是領域實體的屬性顯示還是業務的驗證規則,這都是應用程序處理的不同方面。直接將你的領域模型作為Conroller上的處理參數面臨著安全風險,因為Controller或者Model binder必須確保屬性驗證和用戶不能修改她自己不能修改的屬性(例如,用戶手動更新了一個隱藏的輸入值,或增加一個額外的屬性值,而這個并不是界面上的元素,但卻正好領域模型實體的屬性,這種風險叫做“over-posting”),即使對當前版本的領域模型做了正確的驗證,領域模型將來可能做了變更修改,并沒有出現編譯錯誤或者警告,可能導致新的風險。

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

      如何使用AutoMapper可以參考下面的兩篇文章介紹:

  AutoMapper Formatters are Cool - ASP.NET MVC Style

  AutoMapper in NerdDinner

NET技術使用View Model從表現層分離領域模型,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 翘臀后进美女白嫩屁股视频 | 欧美日韩一级黄色片 | 女人一级毛片免费观看 | 色噜噜狠狠色综合中文字幕 | 亚洲人成网站在线观看90影院 | 桃色园社区| 国产高清美女一级a毛片久久w | 果冻传媒在线看免费高清 | 久久精品AV无码亚洲色欲 | a级精品九九九大片免费看 A级韩国乱理伦片在线观看 | 娇妻归来在线观看免费完整版电影 | 亚洲成人在线免费 | 老师破女学生特级毛片 | 中文无码有码亚洲 欧美 | 全黄h全肉细节文在线观看 全黄H全肉细节文短篇 | 国产久青青青青在线观看 | 2017最新伦理伦理片67 | 伊人香蕉在线播放视频免费 | 中文字幕AV亚洲精品影视 | 奇米色偷偷 | 日本高清无人区影院 | 亚洲免费观看 | 特级做A爰片毛片免费看108 | 蜜桃狠狠色伊人亚洲综合网站 | 欧美国产一区二区三区激情无套 | 单亲妈妈3韩国电影免费观看 | 国产精品青青青高清在线密亚 | 国产成人刺激视频在线观看 | 欧美多人群p刺激交换电影 欧美多毛的大隂道 | 国产99久9在线 | 亚洲色噜噜狠狠网站 | 啪啪漫画无遮挡全彩h网站 啪啪漫画无遮挡全彩h同人 | 做暖暖视频在线看片免费 | 手机在线免费观看毛片 | 成人手机在线观看 | 6080yy奇领电影在线看 | 把腿张开老子CAO烂你动态图 | 亚洲人成网站在线观看90影院 | 美女脱18以下禁止看免费 | 啊…嗯啊好深男男小黄文 | SORA是什么意思 |