天天躁日日躁狠狠躁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從表現層分離領域模型,轉載需保留來源!

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

主站蜘蛛池模板: 日韩视频中文字幕精品偷拍 | 曰本少妇高潮久久久久久 | 戳女人屁股流水羞羞漫画 | 717影院理论午夜伦不卡久久 | 国产精自产拍久久久久久蜜 | 性一交一无一伦一精一品 | 小小水蜜桃视频高清在线观看免费 | 富婆找黑人老外泻火在线播放 | 国产3级在线 | 黄色三级在线观看 | 一个人在线观看视频免费 | 翁熄性放纵交换300章 | chinese东北老年tv视频 | 国内免费视频成人精品 | 青青草 久久久 | chinese耄耋70老太性 | 亚洲国产成人精品无码区APP | 在线观看精品视频看看播放 | 日本欧美高清一区二区视频 | 一亲二脱三插 | 美女视频黄色的 | 免费的av不用播放器的 | 日本边添边摸边做边爱边 | 久久热国产在线视频 | 色婷婷综合久久久久中文一区二区 | 成人高清护士在线播放 | 美女不要啊| 无码国产成人777爽死在线观看 | 精品视频在线一区 | 伊人久久影院大香线蕉 | 国模丽丽啪啪一区二区 | 嘿嘿视频在线观看 成人 | 日本一卡2卡3卡四卡精品网站 | 99热精品在线视频观看 | 国产在线精品亚洲观看不卡欧美 | 国产在线精品亚洲视频在线 | 抽插内射高潮呻吟爆乳 | 无颜之月5集全免费看无删除 | 天天摸夜添狠狠添高 | 羞羞答答影院在线 | 久久只精品99品免费久 |