命令对象只能在控制器中还是可以传递给服务层?
Command object only in controller or could it be passed to service layer?
在 Grails 框架中,我看到了命令对象模式,但它的用法对我来说不是很清楚。此外,Grails 文档给出的大多数示例都是关于域的 classes 而不是命令对象(可能是为了简化代码示例)。
1 - 命令对象是在视图层和控制器层之间使用的东西,必须留在那里?
2 - 还是将命令对象传递给服务层是一个好习惯?
为了说明第 2 点:
class MyController {
def updateUserPassword (UserPasswordCommand cmd) {
...
myService.updatePassword(cmd)
...
}
}
如果第 2 点是不好的做法,那么如何将提交的数据传递到服务层?通过域 class ?
编辑:似乎没问题
[编辑]
如果我使用命令对象而不是域 class 在这种情况下该怎么办:
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() 不能防止数据库引发违反约束的唯一异常或者我错了?
这是将请求参数传递给服务层的最佳方式。我见过有人将参数传递给服务,这确实是最糟糕的做法。我们的控制器应该是转储,控制器方法中的最大 5-8 LOC 是我公司的准则。
命令对象为您提供开箱即用的强大功能,例如验证、方法等
像唯一性这样需要从数据库验证的约束不能应用于命令对象。在这种情况下,您可以使用验证器 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。
在 Grails 框架中,我看到了命令对象模式,但它的用法对我来说不是很清楚。此外,Grails 文档给出的大多数示例都是关于域的 classes 而不是命令对象(可能是为了简化代码示例)。
1 - 命令对象是在视图层和控制器层之间使用的东西,必须留在那里?
2 - 还是将命令对象传递给服务层是一个好习惯?
为了说明第 2 点:
class MyController {
def updateUserPassword (UserPasswordCommand cmd) {
...
myService.updatePassword(cmd)
...
}
}
如果第 2 点是不好的做法,那么如何将提交的数据传递到服务层?通过域 class ? 编辑:似乎没问题
[编辑]
如果我使用命令对象而不是域 class 在这种情况下该怎么办:
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() 不能防止数据库引发违反约束的唯一异常或者我错了?
这是将请求参数传递给服务层的最佳方式。我见过有人将参数传递给服务,这确实是最糟糕的做法。我们的控制器应该是转储,控制器方法中的最大 5-8 LOC 是我公司的准则。
命令对象为您提供开箱即用的强大功能,例如验证、方法等
像唯一性这样需要从数据库验证的约束不能应用于命令对象。在这种情况下,您可以使用验证器 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。