2014-11-04 53 views
6

在阅读“Grails权威指南”时,我对命令对象有点困惑。它们似乎是一个围绕域类的包装来协助验证,但是这些功能已经在域类中通过内置约束和更多通过自定义验证程序提供,那么命令对象究竟做了什么以及什么促使我们需要它呢?Grails命令对象 - 它们背后的动机是什么?

书最后说,

开始对命令对象的讨论“有时一个特定的动作不需要 域类的参与,但仍然需要用户输入的验证。”

但是,它演示了有关Album域类的命令对象的声明和用法。所以,似乎任何命令对象所做的仍然与域类密切相关。我相信我的困惑完全是由于我缺乏理解,所以我想寻求澄清。谢谢。

+2

这可能会帮助您更好地了解它们:http://stackoverflow.com/questions/25803628/grails-the-use-of-service-layer/25804208#25804208 – 2014-11-04 15:54:51

回答

7

他们似乎是围绕域类的包装...

可以使用命令对象的方式,但是这不是他们的主要用途。

当您想封装一组请求参数并与它们一起做某事时,命令对象很有用。这些东西可能会或可能不会与域类有关。

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

不要被束缚,认为命令对象必须绑定到域类。有时他们是,但不限制你对他们的想法。当您想要将一组请求参数关联在一起并使用它们执行某些操作时使用命令对象。

3

我倾向于使用与UI层中发生的事件相匹配的命令对象,表单提交可以用命令对象进行验证,然后传递到执行持久化操作的服务中。有多少次您的域模型与您正在使用的用户界面流程有所不同。

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

相关问题