【问题标题】:Grails Command Objects - What is the motivation behind them?Grails 命令对象——它们背后的动机是什么?
【发布时间】:2014-11-04 15:39:07
【问题描述】:

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

本书通过说明

开始了关于命令对象的讨论

“有时一个特定的动作不需要参与 域类,但仍需要验证用户输入。”

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

【问题讨论】:

标签: grails


【解决方案1】:

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

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

当您想要封装一组请求参数并将它们一起做一些事情时,命令对象很有用。这可能与域类有关,也可能无关。

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

不要拘泥于认为命令对象必须绑定到域类。有时它们是,但不要将您对它们的想法限制在这种情况下。当您想将一组请求参数关联在一起并使用它们执行某些操作时,请使用命令对象。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多