命令对象仅在控制器中或是否可以传递给服务层?

时间:2015-10-26 14:29:01

标签: grails command-objects

在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()时,持续调用电子邮件上的唯一约束,例如

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

测试cmd.hasErrors()不会阻止DB引发违反约束的唯一异常或我错了吗?

2 个答案:

答案 0 :(得分:2)

这是将请求参数传递给服务层的最佳方法。我见过有人将params送去服务,这实际上是最糟糕的做法。我们的控制器应该是转储器,控制器方法中的最大5-8 LOC是我公司的指南。

Command对象为您提供了如此多的功能,如验证,方法等。

答案 1 :(得分: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