Повечето от домейн обектите, които нашата компания използва, ще имат някои общи свойства. Те представляват потребителя, който е създал обекта, потребителя, който последно е актуализирал обекта, и програмата, която е използвал, за да го направи.
В интерес на DRYизвеждане на моите класове по домейн, искам да намеря някакъв начин да добавете една и съща логика на beforeInsert и beforeUpdate към всички класове на домейн, които имат тези колони, без да се намесвате с тези, които нямат.
Как искам да го направя е да използвам Mixin със собствени методи beforeInsert и beforeUpdate. Знам, че можете да използвате Mixins в класове на домейн.
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 всъщност не се задейства, когато се прилага по този начин.
Странична бележка: Знам също, че е възможно да добавите методите във файл BootStrap.groovy с помощта на metaClass, но любопитството ми надделя и наистина искам да видя дали mixin работи. Чувствайте се свободни да ми кажете, че това е по-добрият начин да го направя и че не трябва да се бъркам там, където човек не трябва.