我有一个包含一堆域类的插件。此插件由多个应用程序使用。
我的问题是我无法在域类本身中指定mapping->缓存设置(因为它们需要具有不同的值,具体取决于使用它们的应用程序)。例如,在应用程序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
但我想尽可能避免这种情况
谢谢!
答案 0 :(得分:0)
您提到的方法应该用于理想的案例场景中。 我同意必须在插件和应用程序中进行更改。
理想情况下,插件中的域类应提供可以覆盖的宽松映射。
如果您在插件或grails.gorm.default.mapping { cache true }
中使用过cache: true
或在域类中使用了//Domain class in Plugin
class Person{
static mapping = {
cache: 'read-only'
}
}
,则可以根据需要在应用程序中轻松覆盖它。例如:
//Application A:
Person.metaClass.'static'.mapping = {
cache 'transactional'
}
//Application B:
Person.metaClass.'static'.mapping = {
cache 'read-write'
}
由于映射只是一个groovy对象中的静态块,因此可以在运行时通过metaClassed在相关应用程序中轻松实现,如
//Application A BootStrap
grailsApplication.domainClasses.each{
it.clazz.metaClass.'static'.mapping = {cache 'transactional'}
}
(未测试的)
如果你想为所有域类集体做同样的事情,那么域类artefact可以用如下
//Application A BootStrap
def personClazz =
grailsApplication.domainClasses.find{it.clazz.simpleName == 'Person'}.clazz
personClazz .metaClass.'static'.mapping = {cache 'transactional'}
选择性地:
{{1}}
*您必须在使用插件的应用程序中进行一些修改的任何一种情况。