在Grails中使用命令对象进行更新
我了解到服务用于跨多个域类进行更新。但是,我有命令类,我想知道将事务性更新的逻辑放在命令类中是否有明显的缺点(或者破坏了Grails范式)。比如:在Grails中使用命令对象进行更新,grails,updates,transactional,command-objects,Grails,Updates,Transactional,Command Objects,我了解到服务用于跨多个域类进行更新。但是,我有命令类,我想知道将事务性更新的逻辑放在命令类中是否有明显的缺点(或者破坏了Grails范式)。比如: class ObjectOneCommand { ... def save() { objectOneInstance.save() objectTwoInstance.save() } } 在控制器中 ObjectOne.withTransaction { transactionStatus -&g
class ObjectOneCommand {
...
def save() {
objectOneInstance.save()
objectTwoInstance.save()
}
}
在控制器中
ObjectOne.withTransaction { transactionStatus ->
objectOneCommand.save()
}
我对Grails还不熟悉,但据我所知,command对象基本上是对传入参数进行数据绑定的一种聪明方法,这样您就可以进一步验证它们,或者对它们进行一些处理。本质上,它从域类本身获取域模型约束检查,并在将属性传递给域对象进行持久化(通常通过服务)之前对属性进行处理 因此,命令对象(无论如何对我来说)不是域对象上事务业务逻辑的位置 此外,由于服务可以注入到其他类中,因此可以通过这种方式重用服务中的业务逻辑。如果将逻辑放在命令对象中,依赖项注入不是您的选项,您可能会在不同的命令对象之间复制逻辑
因此,既然您可以将服务注入到命令类中,那么我想您走这条路可能是有意义的。一般来说,这与Grails范式以及大多数MVC范式背道而驰。正如Ciaran指出的,您在命令和控制器类中放置的逻辑是不可重用的。您将无法从其他控制器(轻松)调用它,因此您可能会一次又一次地重新编写它。在您的服务中使用
def transactional=true
创建一个方法来实现这种持久性会更好。查看此链接,作者David Dawson建议使用命令对象对传入请求进行建模,并在整个请求期间维护状态。我不确定这是个好主意还是个坏主意,但它和你描述的非常相似