DTO的替代品 - frankel
資料傳輸物件DTO是在程式之間承載資料的物件。使用它的動機是程式之間的通訊通常通過遠端介面完成,其中每次呼叫都是昂貴的操作。由於每次呼叫的大部分成本都與客戶端和伺服器之間的往返時間有關,因此減少呼叫次數的一種方法是使用一個物件(DTO)來聚合本應傳輸的資料由幾個呼叫,但僅由一個呼叫提供服務。
我不否認轉換資料有一些正當理由。但是,傳統的 DTO 流程還有其他替代方案:
- 從服務層返回一個業務物件
- 將 BO 轉換為表示層中的 DTO
- 從表示層返回 DTO
返回實體本身
當實體的屬性是需要顯示的屬性的超集時,不需要聚合其他屬性。將實體轉換為 DTO 不僅是矯枉過正。它會阻礙效能。
在這種情況下,最好的方法是返回實體本身。
JPA 投影
我們在特定情況下請求特定資料。因此,當呼叫到達資料訪問層時,所需資料的範圍是完全已知的:執行適合此範圍的 SQL 查詢是有意義的。
為此,JPA 提供了預測。本質上,查詢中的投影允許精確地選擇想要的資料。這是一個例子;給定一個Person實體類和一個PersonDetails普通類:
CriteriaQuery<PersonDetails> q = cb.createQuery(PersonDetails.class); Root<Person> c = q.from(Person.class); q.select(cb.construct(PersonDetails.class, c.get(Person_.firstName), c.get(Person_.lastName), c.get(Person_.birthdate) )); |
Jackson轉換器
具體到 JSON,我們可以將提供正確資料的過程委託給序列化框架,例如 Jackson。其背後的想法如下:主要程式碼像往常一樣處理實體,在邊緣,傑克遜轉換器將其轉換為所需的 JSON 結構。
如果需要更少的資料,那就是小菜一碟。如果更多,那麼轉換器需要額外的依賴項來獲取資料。當然,如果這些資料來自同一個資料儲存區,那就不是很好,上面的替代方案更相關。如果沒有,這是一個選擇。
GraphQL
最後但並非最不重要的一點是,可以返回完整的實體並讓客戶端決定哪些資料在其上下文中有意義。
GraphQL就是圍繞這個想法構建的:Facebook 建立了它,現在它是完全開源的。它的主要優點是在其之上提供規範和許多特定於語言的實現。
banq:使用領域事件替代DTO:用事件替代你的DTO資料結構
相關文章
- [譯]JSX的替代品JS
- Docker的組合優於繼承 - frankelDocker繼承
- 深入瞭解 Builder 模式 - frankelUI模式
- 最小可行產品API的實現 - frankelAPI
- JVM上容錯庫的初步比較 - frankelJVM
- DTO轉VO工具
- 簡化Java資料傳輸物件DTO:DTO-Free JavaJava物件
- AppFlowy:Notion 的開源替代品APP
- Turtl:Evernote 的開源替代品
- Redux、rematch、dva的替代品:smoxReduxREM
- Java | DO / DTO / BO / VO的區別Java
- vo bo dto pojo(entity)POJO
- Joplin:真正的 Evernote 開源替代品
- 武裝你的WEBAPI-OData與DTOWebAPI
- 控制你的DTO資料結構 - DZone資料結構
- 建立獨立的Java可執行JAR的三種方法 - frankelJavaJAR
- .NET Core Dto對映(AutoMapper)APP
- 何時使用Entity或DTO
- AvaloniaUI 中的 WPF CompositionTarget.Rendering 替代品UI
- 10 個 Linux 中最好的 Visio 替代品Linux
- PSRAM是非同步SRAM的理想替代品非同步
- 命令列常用工具的替代品命令列
- Adobe Lightroom 的三個開源替代品OOM
- Lambda和清潔程式碼的一個重構案例 - frankel
- .net 中的 Dto 引數封裝物件 使用封裝物件
- protobuff-java 替代品 prorostuffJavaROS
- Adobe Photoshop 的 4 種自由開源替代品
- 沒有CI/CD合在一起的東西! - frankel
- 用Java編寫更好的不可變DTO的技巧 - SebJava
- Java值物件或DTO克隆工具Java物件
- 微服務之間如何共享DTO?微服務
- PO、VO、DTO、DO等淺析
- java使用bytebuddy動態生成帶泛型的DTOJava泛型
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念JavaPOJO
- Rocketgraph:用Golang編寫的Firebase的開源替代品Golang
- WPS Office:Linux 上的 Microsoft Office 的免費替代品LinuxROS
- 使用Apache APISIX+Nginx實現地理路由 - frankelApacheAPINginx路由
- Spring Boot本地原生映象Native-image原始碼 - frankelSpring Boot原始碼