日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ASP.NETMVC中使用ViewModel分離領(lǐng)域模型

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

在港南等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計制作按需搭建網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),港南網(wǎng)站建設(shè)費用合理。

◆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可分為兩大類:SimpleDomainModel和RichDomainModel。

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

RichDomain 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)用,沒必要建立RichDomain Model。然而,如果你正在編寫一個價值數(shù)百萬的企業(yè)內(nèi)聯(lián)網(wǎng)架構(gòu)的核心庫,那么努力開發(fā)一個RichDomain Model就是值得的,它可以為你提供一個準確表達業(yè)務(wù)過程的平臺,并可以讓你快速傳輸數(shù)據(jù)。

MartinFowler在PoEAA中同時簡要介紹了兩種Domain Model。而EricEvans的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!=View Model

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

在ASP.NETMVC的應(yīng)用程序中經(jīng)??梢钥梢钥吹絍iew Model,經(jīng)常我們都認為領(lǐng)域模型和視圖模型是同一個東西。這特別是把領(lǐng)域模型包含在數(shù)據(jù)傳輸對象DTO里的時候,例如使用EntityFramework之類的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就是這幾個DomainModel的總和。領(lǐng)域模型和視圖模型之間有很多相似的地方,我們經(jīng)常干脆就把DomainModel當作View Model來使用了。上面討論了領(lǐng)域模型和視圖模型的相似性,我們來看看都有幾種方式把領(lǐng)域模型轉(zhuǎn)換為視圖模型,通常有3種方法:

1.把領(lǐng)域模型當作視圖模型來用,也就是領(lǐng)域模型就是視圖模型,大部分都是這么用的。

2.視圖模型里面包含一個領(lǐng)域模型,定義一個視圖模型,里面包含了一個領(lǐng)域模型,通過屬性方式進行訪問。

3.將領(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或者Modelbinder必須確保屬性驗證和用戶不能修改她自己不能修改的屬性(例如,用戶手動更新了一個隱藏的輸入值,或增加一個額外的屬性值,而這個并不是界面上的元素,但卻正好領(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。

文章轉(zhuǎn)自自由、創(chuàng)新、研究、探索的博客,

原文地址:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html


新聞名稱:ASP.NETMVC中使用ViewModel分離領(lǐng)域模型
URL標題:http://m.5511xx.com/article/coiihhc.html