Model view controller grails应用程序/服务、grails应用程序/utils和src文件夹之间的区别

Model view controller grails应用程序/服务、grails应用程序/utils和src文件夹之间的区别,model-view-controller,grails,Model View Controller,Grails,我正试图弄清楚这三个文件夹之间的区别,以及我应该放在其中的内容 到目前为止,我一直在将类、接口和其他与域类结构直接相关的内容(通过扩展或实现)放入src文件夹中。任何涉及Grails控制器默认功能之外的其他事务逻辑的内容,我都已放入Grails app/services文件夹中。最后,任何包含“helper”方法(即比较各种事物、特殊字符串操作等)的类,我都已放入grails-app/utils文件夹中 如果我错过了这些文件夹的用途,请让我选择正确的路径。非常接近。grails app/util

我正试图弄清楚这三个文件夹之间的区别,以及我应该放在其中的内容

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


如果我错过了这些文件夹的用途,请让我选择正确的路径。

非常接近。grails app/utils是用于编解码器类的——它的名称怪异,文档不足。我将帮助器类移回src/groovy

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


src/groovy helper类中的静态实用程序方法和服务中的非事务性方法几乎是等价的,因此对我来说,决定采用哪种方法取决于依赖关系。如果该类依赖于Springbean,则将其作为服务,并通过依赖项注入引用它们。否则,只需将其设置为帮助器类。

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

这使得将域类放在插件中变得更简单,这样您就可以通过使用相同的域模型构建多个应用程序来扩展功能,而不是创建一个无法维护的大泥球。它还与Bob Martin叔叔在《失去的建筑岁月》中描述的应用程序模型一致


考虑到您正在考虑体系结构,最好阅读Bob叔叔和Martin Fowler的一些作品。

我想我对事务的实际定义感到困惑。这里()我无法从我的数据库中访问任何东西,直到我按照您的建议使用
with transaction
,所以我假设访问数据库的任何逻辑都是“事务性的”。现在看来我的假设是错误的。你能通过定义什么是“交易”来澄清吗?这是一个相当普遍的概念,并不完全是你所要定义的。Google it:)摘录自:数据库事务是作为单个工作单元处理的一系列操作。这些行动要么完全完成,要么根本不起作用。事务管理是面向RDBMS和RDBMS的企业应用程序的重要组成部分,可确保数据的完整性和一致性。事务的概念可以用以下四个关键属性描述为ACID…有点晚了,但我同意Burt的观点,询问定义是一个有效的问题。例如,grails需要一个
事务
,以便从数据库中获取关系数据(例如author.books),否则它将抛出异常(LazyInitializationException)。无论如何,我猜静态变量被称为
transactional
的原因确实是,如果它是真的,它将在事务中包含完整的逻辑。本文也很有帮助: