VO(檢視模型) 與 DTO(資料傳輸物件)的區別
目錄
- VO(檢視模型) 與 DTO(資料傳輸物件)的區別
- 1.VO與DTO概念
- 2.VO 檢視模型的必要性與解耦
- 2.1 檢視模型
- 2.2 檢視模型存在的必要性
- 2.3 檢視模型的解耦
- 3.DTO 存在的必要性
- 3.1 資料傳輸物件
- 3.2 DTO資料傳輸物件存在的必要性
- 4. VO與DTO的區別
- 4.1 DTO = 檢視模型
- 4.2 DTO ≠ 檢視模型
- 5. AutoMapper的使用場景
- 6. 小結
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 ≠ 檢視模