【问题标题】:Groovy pass request params between classes类之间的 Groovy 传递请求参数
【发布时间】:2014-12-13 15:24:31
【问题描述】:

如果我想处理来自例如网络请求的许多参数并在类(层)之间传递它 - 首选方式是什么?

  • 我知道通过构造函数作为映射传递可选数量的参数很容易。
  • 我也可以直接传递一个映射,如果键与接收对象的属性名称匹配,它应该以类似的方式工作
  • 或者我可以只传递映射,然后从中实例化例如域类
  • 我可以使用一个特殊类作为具有给定属性数量的数据载体

我有一个需要来自用户界面的数据的域类(不是数据库域,而是业务域)。 通过图层传递数据的最佳方式是什么?如果使用带有键值的数据结构(如地图),我如何知道所有必需的数据都在传递?如果我有一个具有给定数量参数的更静态的构造函数,那么我就会知道参数正在被传递。但是,当使用更动态的方法时,我如何确保这一点?有单元测试吗?

【问题讨论】:

  • 您使用的是 Grails、其他一些 Groovy 库/产品/框架,还是这是一个通用问题?
  • 我经常将 Groovy 与 Grails 一起使用,是的。但这也是一个笼统的问题。在 Java 中,我可以使用需要某些参数的“静态”构造函数。或者我可以使用构建器。但是在 Groovy 中,最好的代码风格是什么?如果我想在类和层之间传输数据,我应该为我的类 - 可以使用属性动态实例化 - 假设所有必需的属性都已设置并通过调用类的单元测试验证这一点,还是有一些最佳实践?
  • 我正在尝试某种域驱动设计,将域逻辑与表示和持久性分离,并希望从 Web 请求(或其他请求)中获取数据并将其“传输”到我的用例和域对象。

标签: methods groovy parameters domain-driven-design


【解决方案1】:

在 Grails 中 command objects 是一个很好的选择。您可以毫无问题地将它们传递到各个层。它们非常类似于域类,只是没有完整的持久性功能。

否则我会推荐使用普通的旧 Groovy 类 (POGO)。 Groovy 允许您保持代码非常短(与 Java 和许多其他语言相比)并为您可能需要的常见设计模式提供非常方便的transforms(例如CanonicalImmutableIndexedProperty、@987654328 @...)。

与命令对象相比,POGO 确实需要您编写,例如自己验证代码,但这可以像

一样简单
boolean isValid() {
    name && lastName && countryCode in ['US', 'CA']
}

您可以在 POGO 中保留静态工厂,以帮助您在各种情况下构建它们。此外,您可以在一个文件中定义多个类,这样您就可以将 POGO 代码保留在最有意义的地方。对于简单的地图,我肯定更喜欢这种方法,因为代码封装得更好,POGO 可以进行单元测试和记录。

【讨论】:

  • 非常感谢!我将研究这两个选项,看看什么对我来说是最好的选择。命令对象当然看起来很有趣。谢谢!
  • 命令对象的用途非常广泛,here 是一篇关于它们的有趣文章,here 是一个邮件列表,发布了关于带有命令对象的 BindUsing 注释,非常方便。
  • 谢谢格雷戈尔。当我想到它时,我真正想做的是拥有一个独立于 Web 框架和数据库的“核心”应用程序。我只想将客户端请求数据“传输”到核心域。所以也许带有验证的 POGO 是一个更好的选择......并且还有单元测试来验证调用类是否传递了正确的参数。但是我还没有阅读您的链接,所以我会先阅读:)再次感谢您分享此内容
  • 您链接到的示例与我的情况非常相似,但我不想依赖 Grails 来工作。我有一个具有一种方法的类,我想验证该类是否接收所有必需的参数。所以也许我应该只实现我自己的从该方法调用的验证方法。
猜你喜欢
  • 2023-03-18
  • 2011-02-19
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2011-07-05
  • 2022-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多