【问题标题】:Difference between grails-app/services, grails-app/utils, and src foldersgrails-app/services、grails-app/utils 和 src 文件夹之间的区别
【发布时间】:2012-07-09 03:13:35
【问题描述】:

我正在尝试确定这三个文件夹之间的区别以及我应该在其中放入的内容。

到目前为止,我一直在将类、接口以及与我的域类的结构(通过扩展或实现)直接相关的任何其他内容放入 src 文件夹中。除了默认情况下 Grails 控制器所做的之外,任何涉及额外事务逻辑的东西我都放在grails-app/services 文件夹中。最后,任何包含“帮助”方法的类(即比较各种事物、特殊字符串操作等)我都已放入 grails-app/utils 文件夹。

如果我错过了这些文件夹的用途的标记,请让我走上正确的道路。

【问题讨论】:

  • 这篇文章也有帮助:link

标签: model-view-controller grails


【解决方案1】:

这非常接近。 grails-app/utils 用于 Codec 类——它的名字很奇怪,而且文档不足。我会将帮助类移回 src/groovy。

使用服务进行事务性工作很棒,但您也可以将服务用于非事务性方法。将static transactional = false 添加到具有不需要事务的实用方法的服务类中。请注意,控制器中没有事务性,因此您应该将所有持久性移至事务性服务。

src/groovy 辅助类中的静态实用程序方法和服务中的非事务性方法几乎是等价的,所以对我来说,决定采用哪条路线将归结为依赖关系。如果该类依赖于 Spring bean,则使其成为服务并通过依赖注入引用它们。否则就让它成为一个辅助类。

【讨论】:

  • 我想我对实际定义交易感到困惑。在这里(grails.1312388.n4.nabble.com/…)我无法从我的数据库中访问任何东西,直到我按照你的建议使用withTransaction,所以我假设访问数据库的任何逻辑都是“事务性的”。现在看来我的假设是错误的。您能否通过定义什么是“交易”来澄清一下?
  • 这是一个非常普遍的概念,并不完全是您在 SO 上定义的东西。谷歌它:)
  • 摘自Spring Transaction Management数据库事务是被视为单个工作单元的一系列操作。这些操作要么完全完成,要么完全不生效。事务管理是面向RDBMS的企业应用程序的重要组成部分,以确保数据的完整性和一致性。事务的概念可以用以下四个关键属性描述为 ACID...
  • 有点晚了,但我同意 Burt 的观点,询问定义是一个有效的问题。例如,grails 需要 transaction 才能从数据库中获取关系数据(例如 author.books),否则会抛出异常(LazyInitializationException)。无论如何,我猜想静态变量之所以称为transactional 的原因确实是,如果它是真的,它会将完整的逻辑包含在一个事务中。
【解决方案2】:

如果您发现自己将一个方法添加到依赖于非域类的域类中,请问问自己为什么这个方法可以放在服务中。这导致几乎每个域类都有相应的服务。

这使得将您的域类放入插件中变得更简单,这样您就可以通过使用相同的域模型构建多个应用程序来扩展功能,而不是创建一个无法维护的大泥球。也与Bob Martin大叔在《Lost Years of Architecture http://www.youtube.com/watch?v=WpkDN78P884987654321@》中描述的应用模型一致

鉴于您正在考虑建筑,最好阅读 Bob 叔叔和 Martin Fowler 的一些作品。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2015-08-02
    相关资源
    最近更新 更多