Grails命令对象 - 它们背后的动机是什么?

时间:2014-11-04 15:39:07

标签: grails

在阅读“Grails的权威指南”时,我对命令对象感到有些困惑。它们似乎是域类的包装,以协助验证,但这是通过内置约束进一步通过自定义验证器在域类中可用的功能,那么命令对象的确做什么以及我们需要它的动机是什么?

本书通过陈述

开始讨论命令对象
  

“有时某项行动不需要参与   域类,但仍需要验证用户输入。“

然而,它演示了关于Album域类的命令对象的声明和使用。因此,无论命令对象做什么,它仍然与域类密切相关。我确信我的困惑完全是由于我缺乏理解,所以我希望得到任何澄清。感谢。

2 个答案:

答案 0 :(得分:7)

  

它们似乎是域类的包装......

您可以使用命令对象,但这不是主要用途。

当您想要封装一组请求参数并与它们一起执行某些操作时,命令对象非常有用。那些东西可能与域类有关,也可能没有。

例如,您可以拥有一个Grails应用程序,它根本没有任何域类,命令对象仍然可以真正有用。想象一下Grails应用程序只是一个服务层,它接收来自Web表单的请求或带有JSON正文或其他任何内容的REST请求,Grails应用程序将接收这些请求,验证输入,可能会做一些数学或任何事情然后然后对其他可能将它们存储在数据库中或生成报告或其他内容的后端进程进行REST调用。在这种情况下,即使根本不涉及任何域类,也有很多原因可能需要使用命令对象。

不要认为命令对象必须绑定到域类。有时它们是,但不要限制你对它们的思考。如果要将一组请求参数关联在一起并对它们执行某些操作,请使用命令对象。

答案 1 :(得分:3)

我倾向于使用与UI层中发生的事情相匹配的命令对象,可以使用命令对象验证表单提交,然后将其传递到执行持久化工作的服务中。很多时候让您的域模型与您正在使用的UI流不同。

如果我想要某些流提供足够的信息,我的域层也可能比某些命令对象具有更宽松的约束。