Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Grails中使用命令对象进行更新_Grails_Updates_Transactional_Command Objects - Fatal编程技术网

在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

我了解到服务用于跨多个域类进行更新。但是,我有命令类,我想知道将事务性更新的逻辑放在命令类中是否有明显的缺点(或者破坏了Grails范式)。比如:

class ObjectOneCommand {
...
    def save() {
        objectOneInstance.save()
        objectTwoInstance.save()
    }
}
在控制器中

ObjectOne.withTransaction { transactionStatus ->
    objectOneCommand.save()
}

我对Grails还不熟悉,但据我所知,command对象基本上是对传入参数进行数据绑定的一种聪明方法,这样您就可以进一步验证它们,或者对它们进行一些处理。本质上,它从域类本身获取域模型约束检查,并在将属性传递给域对象进行持久化(通常通过服务)之前对属性进行处理

因此,命令对象(无论如何对我来说)不是域对象上事务业务逻辑的位置

此外,由于服务可以注入到其他类中,因此可以通过这种方式重用服务中的业务逻辑。如果将逻辑放在命令对象中,依赖项注入不是您的选项,您可能会在不同的命令对象之间复制逻辑


因此,既然您可以将服务注入到命令类中,那么我想您走这条路可能是有意义的。

一般来说,这与Grails范式以及大多数MVC范式背道而驰。正如Ciaran指出的,您在命令和控制器类中放置的逻辑是不可重用的。您将无法从其他控制器(轻松)调用它,因此您可能会一次又一次地重新编写它。在您的服务中使用
def transactional=true
创建一个方法来实现这种持久性会更好。

查看此链接,作者David Dawson建议使用命令对象对传入请求进行建模,并在整个请求期间维护状态。我不确定这是个好主意还是个坏主意,但它和你描述的非常相似