目錄前端
VO(View Object):VO是顯示視圖模型,視圖對象,用於展現層,它的做用是把某個指定頁面(或組件)的全部數據封裝起來。舉例:展現層將DTO傳送過來男性顯示成帥哥(客戶端1),或者顯示成靚仔(客戶端2);將帥哥或者靚仔,轉換成男性,以DTO形式請求服務端。json
DTO(Data Transfer Object):DTO是傳輸模型,數據傳輸對象,在這裏泛指用於展現層與服務層之間的數據傳輸對象。接受展現層傳的性別男,返回展現層性別男。
後端
存在在展現層中。api
視圖模型VO能夠對應客戶端的網頁顯示,一樣的DTO好比性別男,能夠對應多個VO進行顯示,便可以對應多個客戶端,好比VO1把性別男顯示成帥哥,VO2把性別男顯示成靚仔等等。數組
若是是一個DTO對應一個VO,則DTO=VO;可是若是一個DTO對應多個VO,則展現層須要把VO轉換爲服務層對應方法所要求的DTO,傳送給服務層。從而達到服務層與展現層解耦的效果。
mvc
一個DTO能夠對應多個從倉儲層返回的DO(Domain Object,領域模型)的json數組,這裏可使用AutoMapper來進行自適配。app
DTO不是爲MVC的視圖而存在的模型,而是爲了適應來自前端請求而存在的。DTO模型把來自前端的請求(這個請求無論來自先後端分離的頁面,仍是mvc的視圖頁面)封裝在DTO模型中,而後服務端處理轉換成Entity Framework中的領域模型。前後端分離
在一個DTO對應一個VO的時候,DTO = 視圖模型。 DTO 和 VO 的屬性值基本是一致的,並且他們一般都是 json對象,所以不必畫蛇添足,但不要忘記這是實現層面的思惟,對於設計層面來講,概念上仍是應該存在 VO 和 DTO ,由於二者有着本質的區別,DTO 表明服務層須要接收的數據和返回的數據,而 VO 表明展現層須要顯示的數據。
應用時,能夠在前端將DTO包成VO,也能夠在服務端的Controller層,service層包成VO。VO轉換成DTO同理。
在這種狀況下能夠實現,先後端相關的東西只有api的url和vo,並且大多數狀況也是隻有一個客戶端的。url
在一個DTO對應多個VO的時候,DTO ≠ 視圖模型。此時須要在前端將男性打包成帥哥或者靚仔顯示;請求數據時,也須要前端將帥哥或者靚仔轉換成男性,以DTO形式請求服務端。設計
網上介紹AutoMapper的使用方法的不少,這裏不作介紹,主要說下使用場景。
AutoMapper是DTO模型和領域模型之間的映射。AutoMapper處理DTO模型和領域模型的轉換。一般的作法是:DTO模型C中包含領域模型A對應的DTO模型A和領域模型B對應的DTO模型B,而後在服務端,分別把DTO模型A和DTO模型B經過AutoMapper轉換成領域模型A和領域模型B。
//好比視圖模型: public class PersonViewModel { public string FirstName{get;set;} public string LastName{get;set;} } //好比領域模型: public class Person { public string Name{get;set;} } //領域模型在上下文中: public class MyDbContext : DbContext { public DbSet<Person> Persons{get;set;} }
1.DTO是把數據進行傳輸的對象,重點在哪裏進行 「傳輸」:展現層和應用層,只要是在 展現層和應用層 之間進行數據交互的,都是 Dto。 2.1個DTO對應1個客戶端狀況下,DTO = 視圖模型;1個DTO對應多個客戶端狀況下,DTO ≠ 視圖模型;