2013-07-03 39 views
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 

,但我想避免,如果可能的

謝謝!

+0

爲什麼要避免這種方法? – dmahapatro

+0

它很難修改這個插件中的域類,並將它們重新發布到其他項目中,並且這意味着其他類的其他項目需要進行相同的緩存修改,並且最終成爲一件麻煩事。所以如果我能避免它會很好。不一定是技術原因,更多的是官僚主義。 –

回答

0

您提到的方法應該用在理想的情況下。 我同意在插件和應用程序中也必須進行更改。

理想情況下,插件中的域類應提供可以重寫的寬鬆映射。

如果您在插件或cache: true中使用了grails.gorm.default.mapping { cache true }或者曾經在域類中映射過,那麼它可以很容易地根據需要在應用程序中被覆蓋。例如:

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

由於映射不過是一個靜態塊在運行時關注應用常規對象時,它可以很容易地通過metaClassed像

//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'} 

*無論你需要做的在使用插件的應用做一些修改的情況。

+0

這會覆蓋現有的映射塊還是會追加? –

+0

這將覆蓋,是的,你必須指定所有的映射@AlexBeardsley。 – dmahapatro

+0

在grails查看映射之前,bootstrap還會運行嗎?我其實並不熟悉事情執行的順序。 –