2014-12-13 25 views
0

如果我想處理來自例如Web請求的許多參數並在類(層)之間傳遞它,那麼首選方法是什麼?Groovy在類之間傳遞請求參數

  • 我知道很容易通過構造函數傳遞可選數量的參數作爲映射。
  • 我也可以直接通過地圖,如果密鑰匹配的接收對象的屬性名應當以類似的方式工作
  • 或者我可以只通過地圖,然後從
  • 我實例例如域類可以使用特殊的類作爲數據載體,具有給定數量的屬性

我有一個需要來自用戶界面的數據的域類(不是數據庫域,但是業務域)。 通過圖層傳遞數據的最佳方式是什麼?如何使用數據結構(如地圖)和關鍵值來傳遞所有必需的數據?如果我將有一個更多靜態構造函數給定數量的參數,那麼我會知道參數正在傳遞。但是如何在使用更動態的方法時保證這一點?通過單元測試?

+0

您是否在使用Grails,一些其他的Groovy庫/產品/框架,或者這是一個通用的問題? – 2014-12-13 21:40:49

+0

我經常在Grails上使用Groovy,是的。但這也是一個通用的問題。在Java中,我可以使用需要某些參數的「靜態」構造函數。或者我可以使用一個建造者。但是在Groovy中,最好的代碼風格是什麼?如果我想在類和圖層之間傳輸數據,我是否應該爲我的類(可以動態地使用屬性實例化)假設所有必需的屬性都已設置並通過單元測試來驗證調用類,還是有一些最佳實踐? – 2014-12-13 21:54:20

+0

我在嘗試某種域驅動設計,將域邏輯從表示和持久性中分離出來,並希望從Web請求(或其他請求)獲取數據並將其「傳輸」到我的用例和域對象。 – 2014-12-13 21:58:21

回答

0

Well in Grails command objects是一個很好的選擇。你可以將它們傳遞給各個層面而沒有問題。它們非常類似於域類,只是沒有整個持久性功能。

否則,我會建議使用普通的舊Groovy類(POGO)。 Groovy允許您保持代碼非常短(與Java和其他許多語言相比),並且對於您可能需要的常用設計模式(例如Canonical,Immutable,IndexedProperty,DelegatesTo ...)提供非常方便的transforms

與命令對象相比,POGO確實需要您編寫例如自己驗證代碼,但是這可能是一樣簡單

boolean isValid() { 
    name && lastName && countryCode in ['US', 'CA'] 
} 

你可以把靜態的工廠在POGO,以幫助您構建它們在各種情況下。另外,您可以在一個文件中定義多個類,這樣您就可以在任何最合理的地方保留POGO代碼。我肯定會喜歡這種方法來簡單的地圖,因爲代碼是更好的封裝,POGOs可以單元測試&記錄。

+0

非常感謝!我會研究這兩個選項,看看對我來說什麼是最佳選擇。命令對象看起來很有趣。謝謝! – 2014-12-14 15:17:12

+0

命令對象是非常通用的,[這裏](http://padcom13.blogspot.com/2010/10/grails-controllers-and-command-objects.html)是一篇關於它們的有趣文章,[here](http ://grails.1312388.n4.nabble.com/Command-Object-Converting-a-comma-strings-to-a-List-of-String-td4644058。html)是一個郵件列表,發佈了'BindUsing'註釋和命令對象,可以非常方便。 – 2014-12-14 15:50:38

+0

謝謝格里高爾。當我想到它時,我真正想要做的是擁有一個獨立於Web框架和數據庫的「核心」應用程序。我只是想將客戶端請求數據「轉移」到核心域。所以也許POGO驗證是一個更好的選擇...並且還有單元測試來驗證調用類傳遞正確的參數。但我還沒有閱讀你的鏈接,所以我會這樣做:) 再次,非常感謝分享這 – 2014-12-14 18:35:29