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


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

1.VO與DTO概念

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

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

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

2.1 視圖模型

存在在展示層中。

2.2 視圖模型存在的必要性

視圖模型VO可以對應客戶端的網頁顯示,同樣的DTO比如性別男,可以對應多個VO進行顯示,即可以對應多個客戶端,比如VO1把性別男顯示成帥哥,VO2把性別男顯示成靚仔等等。

2.3 視圖模型的解耦

如果是一個DTO對應一個VO,則DTO=VO;但是如果一個DTO對應多個VO,則展示層需要把VO轉換為服務層對應方法所要求的DTO,傳送給服務層。從而達到服務層與展示層解耦的效果。

3.DTO 存在的必要性

3.1 數據傳輸對象

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

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,而且大多數情況也是只有一個客戶端的。

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 ≠ 視圖模型;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM