Grails フレームワークでは、コマンド オブジェクト パターンを見ましたが、その使用方法はあまり明確ではありません。さらに、Grails のドキュメントに記載されている例のほとんどは、コマンド オブジェクトではなくドメイン クラスに関するものです (コード例を簡略化するためかもしれません)。
1 - コマンド オブジェクトは、ビューとコントローラー レイヤーの間で使用されるものであり、そこにとどまる必要がありますか?
2 - または、コマンド オブジェクトをサービス レイヤーに渡すことをお勧めしますか?
ポイント 2 を説明するには:
class MyController {
def updateUserPassword (UserPasswordCommand cmd) {
...
myService.updatePassword(cmd)
...
}
}
ポイント 2 が悪い習慣である場合、送信されたデータをサービス層に渡すにはどうすればよいでしょうか? ドメインクラス経由? 編集:問題ないようです
[編集]
ドメインクラスではなくコマンドオブジェクトを使用する場合、この場合の対処方法:
def signup(UserCreateCommand cmd)
{
if (!cmd.hasErrors()) {
def userInstance = userService.signup(cmd)
}
}
if (cmd.hasErrors()) {
/* Stay on form in order to display errors */
render(view:"/app/authentication/_signupForm", model:[userCreateCommand: cmd])
return
}
...
}
ユーザー サービス トランザクションが終了したときに、データベースによって例外が発生した場合 (スキーマの制約を無視してデータをフラッシュしたため) はどうなりますか?
私の観点からの問題は、次の 2 つのクエリがあることです。
まず - cmd.hasErrors() を呼び出すと、たとえば電子メールで一意の制約が永続的に呼び出されます
第二に-サービストランザクションが終了すると、DBへのフラッシュがあり(私の場合、1つのSQL挿入が発生します)、一意の制約を持つ列のメールで例外が発生する可能性があります
テスト cmd.hasErrors() は、DB が違反した制約固有の例外を発生させた場合、または私が間違っている場合を防止しませんか?