VO(視圖模型) 與 DTO(數據傳輸對象)的區別

VO(視圖模型) 與 DTO(數據傳輸對象)的區別


1.VO與DTO概念

VO(View Object):VO是顯示視圖模型,視圖對象,用於展現層,它的做用是把某個指定頁面(或組件)的全部數據封裝起來。舉例:展現層將DTO傳送過來男性顯示成帥哥(客戶端1),或者顯示成靚仔(客戶端2);將帥哥或者靚仔,轉換成男性,以DTO形式請求服務端。json

DTO(Data Transfer Object):DTO是傳輸模型,數據傳輸對象,在這裏泛指用於展現層與服務層之間的數據傳輸對象。接受展現層傳的性別男,返回展現層性別男。
後端


2.VO 視圖模型的必要性與解耦

2.1 視圖模型

存在在展現層中。api

2.2 視圖模型存在的必要性

視圖模型VO能夠對應客戶端的網頁顯示,一樣的DTO好比性別男,能夠對應多個VO進行顯示,便可以對應多個客戶端,好比VO1把性別男顯示成帥哥,VO2把性別男顯示成靚仔等等。數組

2.3 視圖模型的解耦

若是是一個DTO對應一個VO,則DTO=VO;可是若是一個DTO對應多個VO,則展現層須要把VO轉換爲服務層對應方法所要求的DTO,傳送給服務層。從而達到服務層與展現層解耦的效果。
mvc


3.DTO 存在的必要性

3.1 數據傳輸對象

一個DTO能夠對應多個從倉儲層返回的DO(Domain Object,領域模型)的json數組,這裏可使用AutoMapper來進行自適配。app

3.2 DTO數據傳輸對象存在的必要性

DTO不是爲MVC的視圖而存在的模型,而是爲了適應來自前端請求而存在的。DTO模型把來自前端的請求(這個請求無論來自先後端分離的頁面,仍是mvc的視圖頁面)封裝在DTO模型中,而後服務端處理轉換成Entity Framework中的領域模型。前後端分離


4. VO與DTO的區別

4.1 DTO = 視圖模型

在一個DTO對應一個VO的時候,DTO = 視圖模型。 DTO 和 VO 的屬性值基本是一致的,並且他們一般都是 json對象,所以不必畫蛇添足,但不要忘記這是實現層面的思惟,對於設計層面來講,概念上仍是應該存在 VO 和 DTO ,由於二者有着本質的區別,DTO 表明服務層須要接收的數據和返回的數據,而 VO 表明展現層須要顯示的數據。
應用時,能夠在前端將DTO包成VO,也能夠在服務端的Controller層,service層包成VO。VO轉換成DTO同理。
在這種狀況下能夠實現,先後端相關的東西只有api的url和vo,並且大多數狀況也是隻有一個客戶端的。url

4.2 DTO ≠ 視圖模型

在一個DTO對應多個VO的時候,DTO ≠ 視圖模型。此時須要在前端將男性打包成帥哥或者靚仔顯示;請求數據時,也須要前端將帥哥或者靚仔轉換成男性,以DTO形式請求服務端。設計

5. AutoMapper的使用場景

網上介紹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;}
}

6. 小結

1.DTO是把數據進行傳輸的對象,重點在哪裏進行 「傳輸」:展現層和應用層,只要是在 展現層和應用層 之間進行數據交互的,都是 Dto。 2.1個DTO對應1個客戶端狀況下,DTO = 視圖模型;1個DTO對應多個客戶端狀況下,DTO ≠ 視圖模型;

相關文章
相關標籤/搜索