第一次開發一個REST應用程序,並且以前沒有關於Spring Framework的知識。幾乎所有我開發的Web應用程序都是PHP(Laravel),C#(ASP.NET和MVC)或Python(Django)。Spring設計模式對其他應用程序的推薦
當主題是設計模式時,我非常困惑。
使用上https://spring.io/guides(https://spring.io/guides/tutorials/bookmarks/)提供的指南,我看到一個設計模式是使用:
實體,庫,服務和控制器(RestController),如:
當用戶請求/user/{id}
(僅舉例)時,控制器要求S ervice返回用戶,那麼,服務問庫,具有實體該返回,因此,該服務通此實體到控制器(至少在本例中) ;
request = Controller -> Service -> Repository -> Entity
response = Repository return Entity -> Service -> Controller
第一件事:
這是正確的?我知道這些作品,但這是一種常見做法(或至少是「最佳做法」)?
對我來說,看起來並不正確通過Entity
(如果此實體是數據庫中對象的確切表示)到我的controller
。
假設我的實體具有密碼屬性。我將密碼傳遞給我的controller
。當然,我可以在回到controller
之前「隱藏」service
的密碼,但controller
仍然會收到帶有密碼屬性的entity
。
現在,以相反的方式。假設我想創建一個新用戶(Entity
),並且在我的數據庫中,我有一個expirationDate
屬性,根據註冊日期自動計算。我的Entity
表示必須具有expirationDate
屬性,但在發佈後,我不需要(也不應該)將任何值傳遞給此屬性。
這種情況下的「最佳實踐」是什麼?在C#/ MVC/ASP.NET中,通常我爲這些情況使用了一個新實體(又名ViewModel
)。
看着http://www.robertomarchetto.com/java_rest_api_best_practices_spring_boot,我看到了另一種設計模式,似乎存在Entity
(或DTO
)對每個響應的類型(如UserResponseDto
和UserRegistrationDto
在我的例子 - DAO比庫一樣?)。
那麼,在我的例子中是正確的使用這種模式?
request -> Controller -> Service -> Repository -> Entity (DB representation)
response -> Repository return a Entity -> Service convert Entity to a DTO -> Controller
謝謝! [使用bean驗證簡化服務層設計](https://www.link-intersystems.com/blog/2012/02/05/simplify-service-layer-design-using-bean-validation-jsr-303/)對我來說是新事物!真的有幫助! :d –