2014-11-04 54 views
6

在閱讀「Grails權威指南」時,我對命令對象有點困惑。它們似乎是一個圍繞域類的包裝來協助驗證,但是這些功能已經在域類中通過內置約束和更多通過自定義驗證程序提供,那麼命令對象究竟做了什麼以及什麼促使我們需要它呢?Grails命令對象 - 它們背後的動機是什麼?

書最後說,

開始對命令對象的討論「有時一個特定的動作不需要 域類的參與,但仍然需要用戶輸入的驗證。」

但是,它演示了有關Album域類的命令對象的聲明和用法。所以,似乎任何命令對象所做的仍然與域類密切相關。我相信我的困惑完全是由於我缺乏理解,所以我想尋求澄清。謝謝。

+2

這可能會幫助您更好地瞭解它們:http://stackoverflow.com/questions/25803628/grails-the-use-of-service-layer/25804208#25804208 – 2014-11-04 15:54:51

回答

7

他們似乎是圍繞域類的包裝...

可以使用命令對象的方式,但是這不是他們的主要用途。

當您想封裝一組請求參數並與它們一起做某事時,命令對象很有用。這些東西可能會或可能不會與域類有關。

例如,您可以擁有一個Grails應用程序,該應用程序根本沒有任何域類,命令對象仍然非常有用。想象一下,一個Grails應用程序只是一個服務層,它接收來自Web窗體或帶有JSON主體或其他任何地方的REST請求的請求,並且Grails應用程序將接收這些請求,驗證輸入,可能做一些數學或任何事情,然後對可能存儲在數據庫中的其他後端進程進行REST調用,或者生成報告或其他內容。在這樣的情況下,即使根本沒有涉及任何域類,也可能有很多原因需要使用命令對象。

不要被束縛,認爲命令對象必須綁定到域類。有時他們是,但不限制你對他們的想法。當您想要將一組請求參數關聯在一起並使用它們執行某些操作時使用命令對象。

3

我傾向於使用與UI層中發生的事件相匹配的命令對象,表單提交可以用命令對象進行驗證,然後傳遞到執行持久化操作的服務中。有多少次您的域模型與您正在使用的用戶界面流程有所不同。

如果我想要求某些流提供足夠的信息,我的域也可能比某些命令對象具有更鬆散的約束。

相關問題