1

我有一个包含一堆域类的插件。该插件被多个应用程序使用。

我的问题是我无法在域类本身中指定映射->缓存设置(因为它们需要具有不同的值,具体取决于使用它们的应用程序)。例如,在应用程序 A 中,我想让域类 X 只读缓存,而域类 Y 不缓存。在应用程序 B 中,我想缓存域类 X 事务,并缓存域类 Y 只读。

我想要的(我希望这已经可用)是这样的:

grails.gorm.default.mapping { cache true } 

但不是全局性的,我可以只应用到一个特定的域类,比如:

grails.gorm.com.integralblue.domain.User.mapping { cache true } 

有人建议让每个域类检查 grails 配置,例如:

static mapping = {
    cache: Holders.grailsApplication.config.com.package.Person.cache ?: false
}

和配置:

com.package.Person.cache = true

但如果可能的话,我想避免这种情况

谢谢!

4

1 回答 1

0

您提到的方法应该在理想情况下使用。我同意必须在插件和应用程序中进行更改。

理想情况下,插件中的域类应该提供一个可以覆盖的宽松映射。

如果您grails.gorm.default.mapping { cache true }在插件中使用过或cache: true在域类中使用过映射,则可以根据需要在应用程序中轻松覆盖它。例如:

//Domain class in Plugin
class Person{
   static mapping = {
      cache: 'read-only'
   }
}

由于映射只不过是 groovy 对象中的一个静态块,因此它可以在运行时通过相关应用程序中的元分类轻松地进行,例如

//Application A:
Person.metaClass.'static'.mapping = {
    cache 'transactional'
}

//Application B:
Person.metaClass.'static'.mapping = {
    cache 'read-write'
}

(未经测试)
如果您想对所有域类共同执行相同的操作,则可以使用域类工件,如下所示

//Application A BootStrap
grailsApplication.domainClasses.each{
    it.clazz.metaClass.'static'.mapping = {cache 'transactional'}
}

选择性地:

//Application A BootStrap
def personClazz = 
     grailsApplication.domainClasses.find{it.clazz.simpleName == 'Person'}.clazz
personClazz .metaClass.'static'.mapping = {cache 'transactional'}

*在任何一种情况下,您都必须使用插件在应用程序中进行一些修改。

于 2013-07-03T18:15:06.360 回答