2010-10-07 39 views
35

在課上,我們現在正在學習如何構建Spring應用程序,儘管Spring沒有直接參與,但我們學習瞭如何爲DAO和服務層對象創建接口。服務層和控制器:誰照顧什麼?

請糾正我,如果我錯了: DAO層是相當抽象的:它只是包含CRUD操作,並進一步用於讀取數據。(即:讓所有的對象,獲得特定對象等)

服務層:包含創建事物和刪除事物的服務,這是業務邏輯應該在的地方。

現在所有這些在服務層中都是有意義的;除了「更新」對象。你只是把一個「更新」功能,只保存在數據庫中的對象?或者你還需要在那裏定義邏輯?這是我的困惑所在,我的理解是Spring中的對象只是POJO的。那麼誰驗證數據?

比方說,我有一個對象 「子」 有:NameSurNameGenderPhotoBirthdate 領域。 我將如何命名這些服務?或者你會讓控制器負責驗證,這對我來說似乎並不正確。另一方面,將每個需要調用的服務器委派給服務層也不太合適。

所以基本上:幫助我如何定義通過服務層保存對象。

回答

22

如果您希望控制器能夠堅持更改爲Child對象,那麼傳統的你會在名字類似ChildService.update(Child newchild)的服務,這將處理調用正確的DAO的方法堅持這個孩子的新版本。

控制器可以自由地爲子項請求服務,改變周圍的字段(可以根據用戶的輸入) - 一個理智的設計會讓控制器和Child POJO一起工作,然後讓服務持久化更改。該模型POJO竟然一無所知控制器,服務或DAO只是簡單地保存數據按照你的建議 - 當然你不會想每次調用setName()setGender()自動導致數據庫更新。

相反,控制器和/或服務應該獲得一個對象,爲其工作單元中的對象做所需的任何工作,然後請求一個服務(然後是DAO)來堅持這些更改。

驗證可以發生在幾個層次 - 控制器可能想要驗證來自Web用戶的任何輸入,並且服務可能要驗證它有一個有效的Child對象,然後它保留它。這尤其是很有意義的,在情況下兩層驗證的一些水平,你想重新使用在其他方面的能力這一服務 - 如暴露REST接口,不同的前端等

35

一般一個春季服務是事務性的。事物進入一個特定的服務方法,因爲他們應該在同一個事務中組合在一起。如果你想從數據庫中檢索一個對象,把它旋轉,並保存新版本,檢索和保存應該在同一個服務方法中。因此,您的服務方法是根據您的應用程序爲用戶執行的操作確定的。

我嘗試限制控制器執行與驗證http參數有關的工作,決定使用什麼參數調用什麼服務方法,要在httpsession或請求中放置什麼,重定向或轉發哪些視圖或類似的與web相關的東東。

就驗證而言:驗證控制器中的輸入參數是確保沒有人能夠通過虛假輸入破壞您的應用程序的一件好事。控制器中的驗證往往是要確保輸入在語法上可以正常工作(包括檢測注入攻擊),而服務級別驗證是關於確保數據庫中事物的狀態與您期望的一致。

所以控制器包含web框架基礎架構代碼,服務包含應用程序邏輯代碼。

+3

只是爲了補充一點:這對於一般的「服務」來說是一個好主意(不僅在使用Spring時,但也許在公開遠程服務或某種類型的API時)使方法成爲事務的自然候選 – 2010-10-08 01:33:59

相關問題