簡體   English   中英

DTO,DAO或服務層?

[英]DTO's, DAO or Service layer?

我的應用程序基於典型的3層體系結構,目標是創建一個SpringMVC站點和一個Spring Batch解決方案,該解決方案可以提供和維護我們數據庫的產品和庫存,其中速度是一個非常重要的因素。

我正在使用Spring的JdbcTemplate來管理遺留數據庫。 我的一些表包含許多我不使用的列,並且由於某些字段的大小(我們甚至不需要映射的blob),檢索整行顯示了負面影響,所以我創建了一些與之匹配的bean我想要檢索的列,例如:

  • Product - 包含與DB中存儲的字段的1:1關系。
  • ProductDetailsView - 包含id,名稱,價格,描述,股票。
  • ProductListItemView - Id,價格,名稱,股票。

DAO層將這些bean返回給服務層。 創建DTO以在我的產品服務界面中公開它的AFAIK可能有意義,但是,

1) ProductDetailsViewProductListItemView怎么樣?

2)我應該從這些“視圖”或“投影”到具有相同屬性的DTO進行1:1映射嗎? 為什么?

3)在任何情況下,你會在哪里放置JSR-303注釋來驗證網絡的輸入?

通常,DTO的使用是由於將實體與視圖分離,然后數據庫中的任何內部更改都不會影響視圖或客戶端,並且視圖根本不需要更改。 除非您需要發送更多或不同的信息。 但是您沒有使用JPA,而是使用jdbctemplate,因此您的對象可以立即作為DTO執行,因為您不依賴於數據庫模型。

對於Product實體,似乎創建DTO是一種很好的方法,因為您的視圖對象只是存儲在數據庫中的整個對象的部分表示。

  1. 我看到ProductDetailsView和ProductListItemView中有一個最小數量的列,(可能你只是放了一個集合),如果你認為你的表定義沒有太大的變化,因為它們不是那么大你可以使用實體對象就像休息庫方法一樣。

  2. 預測也是解決相同要求的另一種方法,避免向視圖發送無關緊要的信息,但您將在同一個POJO中包含jackson注釋和jpa注釋。 (當您使用ORM時更多)。 人們不喜歡這么多,這就是創建DTO的方法

  3. 通常JSR303注釋屬於“輸入”對象,一旦到達控制器就會檢查它們,您可以使用與Springmvc和jsr一起使用的@Validated注釋,這在屬於您的端點的方法中使用。

我認為沒有黃金法則,但我會嘗試盡可能地分離數據庫層的視圖。 當您使用jdbcTemplate時,您不必擔心帶來整個表示或者表的急切/懶惰集合有問題,因為您始終可以修改投影以使用獲取您將使用的內容。 考慮從DAO帶來您將發送到視圖的DTO,並將其用作CRUD操作中的輸入對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM