DTO的替代品 - frankel

banq發表於2022-03-11

資料傳輸物件DTO是在程式之間承載資料的物件。使用它的動機是程式之間的通訊通常通過遠端介面完成,其中每次呼叫都是昂貴的操作。由於每次呼叫的大部分成本都與客戶端和伺服器之間的往返時間有關,因此減少呼叫次數的一種方法是使用一個物件(DTO)來聚合本應傳輸的資料由幾個呼叫,但僅由一個呼叫提供服務。

我不否認轉換資料有一些正當理由。但是,傳統的 DTO 流程還有其他替代方案:

  1. 從服務層返回一個業務物件
  2. 將 BO 轉換為表示層中的 DTO
  3. 從表示層返回 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資料結構

 

相關文章