0

在 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
    }
    ...
}

如果用户服务事务结束时发生数据库突袭的异常(因为刷新数据不遵守模式约束),会发生什么?

在我看来,问题在于有两个查询:

首先 - 例如,当调用 cmd.hasErrors() 时,会持续调用电子邮件的唯一约束

其次 - 当服务事务结束时,会刷新数据库(在我的情况下会导致一个 SQL 插入),并且可能会在具有唯一约束的列电子邮件上引发异常

测试 cmd.hasErrors() 并不能防止 DB 引发违反约束唯一异常的情况,或者我错了?

4

2 回答 2

2

这是将请求参数传递给服务层的最佳方式。我见过人们将参数传递给服务,这确实是一种最糟糕的做法。我们的控制器应该转储,控制器方法中的 Max 5-8 LOC 是我公司的指导方针。

命令对象为您提供了开箱即用的强大功能,例如验证、方法等。

于 2015-10-26T15:01:30.690 回答
0

需要从数据库验证的唯一性约束不能应用于命令对象。在这种情况下,您可以使用验证器http://grails.github.io/grails-doc/2.5.1/ref/Constraints/validator.html

您还可以使用 importFrom 约束让所有约束形式用户域到命令对象http://grails.github.io/grails-doc/2.5.1/guide/validation.html

于 2015-10-27T12:08:17.783 回答