gpt4 book ai didi

grails - 来自 Mixin 的公共(public)域列的常见 beforeInsert 和 beforeUpdate 方法

转载 作者:行者123 更新时间:2023-12-02 14:14:54 33 4
gpt4 key购买 nike

我们公司使用的大多数域对象都会有一些共同的属性。这些代表创建对象的用户、最后更新对象的用户以及他们用来执行此操作的程序。

为了DRY 的利益退出我的域类后,我想找到某种方法将相同的 beforeInsert 和 beforeUpdate 逻辑添加到所有具有这些列的域类,而不会干扰那些没有这些列的域类。

我想如何使用 Mixin有自己的 beforeInsert 和 beforeUpdate 方法。我知道you can use Mixins on domain classes .

package my.com

import my.com.DomainMixin

@Mixin(DomainMixin)
class MyClass {
String foo
String creator
String updater

static constraints = {
creator nullable:false
updater nullable:false
}
}


package my.com
class DomainMixin {
def beforeInsert() {
this.creator = 'foo'
this.updater = 'foo'
}

def beforeUpdate() {
this.updater = 'bar'
}
}

单元测试表明,当以这种方式实现时, beforeInsert 方法实际上并没有被触发。

边注:
我也知道有可能 to add the methods in a BootStrap.groovy file使用metaClass,但我的好奇心让我变得更好,我真的很想看看mixin是否有效。随意告诉我这是更好的方法,我不应该在人不应该的地方混淆。

最佳答案

仅供引用,使用 groovy.lang.Mixin强烈反对(例如,Groovy 项目负责人)。如果你必须使用 mixins,你应该使用 grails.util.Mixin反而。我不喜欢您的 mixin 方法的一件事是隐含且未强制执行的假设,即 mixin 的目标具有 creator。和 updater特性

就个人而言,我可能会为此使用普通的继承,例如

abstract class Audit {

String creator
String updater

def beforeInsert() {
this.creator = 'foo'
this.updater = 'foo'
}

def beforeUpdate() {
this.updater = 'bar'
}

static constraints = {
creator nullable: false
updater nullable: false
}
}

任何需要审计的域类都可以简单地扩展 Audit .另一种(也是更可取的)方法是使用 trait而不是抽象基类,但您需要使用相当新的 Grails 版本才能执行此操作。

关于grails - 来自 Mixin 的公共(public)域列的常见 beforeInsert 和 beforeUpdate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954272/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com