一、什麼是DTO和VO
Data Transfer Object (DTO) 和 Value Object (VO) 是在軟件開發中非常常見的兩種數據結構,但是它們的用途和含義有所不同。
DTO 在不同層次的應用程序之間傳輸數據,並且DTO負責封裝與業務相關的數據和傳輸規則,而且它們是完全分離的層次結構。DTO 對象通常是無狀態,這意味着當數據傳輸完成後就可以將 dto 對象捨棄,可以用於 RPC(Remote Procedure Call) 等情境。
VO 不是用於數據傳輸的,而是用於在前端與用戶交互,展示業務相關的數據。將一個領域模型的狀態“塞”到vo中,以傳遞給前端ui層。
二、DTO and VO示例
1. DTO示例
public class UserDTO { private Long id; private String name; private Integer age; // getter and setter ... }
DTO對象設計簡單明了,注意到的是,我們定義了一個公開的無參數的構造器,這是因為我們將要使用反序列化技術將相關數據解析成與此對象相對應的實例。
2. VO示例
public class UserVO { private String name; private Integer age; // getter and setter ... }
請留意到這裡 VO 與 DTO 之間的顯著差異。首先,我們沒有定義 ID,它不是為了向業務層返回而存在的。其次是 public 無參數構造器,也是為了前端界面進行數據組裝時所必須的。顯然,我們不需要複製字段,更不需要加額外的方法,因為 VO 並不承擔任何業務邏輯。
三、DTO and VO在實戰開發中的應用
1. 應用場景
在應用程序中,DTO 和 VO 應該扮演着不同的角色。DTO 可以用於跨網絡傳輸數據,可以克服不同操作系統和語言之間的差異。數據在網絡傳輸時,可能會發生丟失。DTO 可以在應用程序的不同層之間傳遞數據,減少數據層次結構。
VO 在前端展示中扮演着非常重要的角色。UI 設計師可以使用 VO 減少 HTML 模板中的邏輯。VO 還有助於確保在請求超過一次時整個數據的一致性。
2. 實戰應用舉例
假設我們有一個用戶管理系統,並且我們需要展示用戶列表到UI層。假設有兩個前端頁面需要用戶列表數據:用戶管理界面和用戶詳情頁面。
這個時候,我們可以實現兩個DTO對象:UserListDTO用於傳遞完整的用戶列表信息和 UserDetailsDTO 用於傳遞單個用戶的詳細信息。
//UserListDTO public class UserListDTO{ private Long userId; private String userName; private Integer userAge; // getter and setter ... } //UserDetailsDTO public class UserDetailsDTO{ private String userName; private Integer userAge; private String userAddress; private Integer userRole; // getter and setter ... } //UserMapper.java public UserListDTO mapToUserListDTO(UserEntity entity){ UserListDTO dto = new UserListDTO(); dto.setUserId(entity.getId()); dto.setUserName(entity.getName()); dto.setUserAge(entity.getAge()); return dto; } //UserController.java @GetMapping("/all") public UserListDTO getAllUsers(){ List users = userService.getAllUsers(); return users.stream() .map(user->userMapper.mapToUserListDTO(user)) .collect(Collectors.toList()); } //UserController.java @GetMapping("/{id}") public UserDetailsDTO getUserDetails(@PathVariable Long id){ UserEntity user = userService.getUserById(id); return userMapper.mapToUserDetailsDTO(user); }
這個時候,前端頁面也相應發生了變化,顯示用戶列表和單個用戶詳情信息。前端接收到的數據格式也與DTO中定義的完全一致。
四、結論
DTO和VO不應該僅僅只是一個由getter和setter方法組成的帶注釋 Java Bean,它們應該是有目的的數據結構,每個字段都需要在DTO或VO上進行明確的分類和注釋。DTO 和 VO 廣泛應用於各級別的應用程序,使數據傳輸變得更加高效,更容易管理,無論是對於後端還是前端來說。
原創文章,作者:EMAZL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/334821.html