我们在Grails / Groovy中构建了一个Web应用程序。在groovy中,我们构建了一个可插入的缓存组件,以便在Grails应用程序中提供大型http响应流的缓存。我们希望在运行时基于环境注入缓存实现,例如,当开发人员正在做一些本地工作时,注入一个简单的基于Map的缓存,但是在操作环境中,注入一个RDBMS缓存数据库,你就明白了。
我们在使用SWITCH的Grails教程中找到了这个参考,它似乎有用,但它很丑陋而且很麻烦。我们有超过5种不同的环境(本地,开发,测试,uat和prod),我们需要在代码中的其他地方注入特定于环境的类,所以这种方法绝对不是理想的。还有其他选择吗?我们将不胜感激,谢谢!
//from resources.groovy
beans = {
switch(Environment.current) {
case Environment.PRODUCTION:
cacheBean(com.util.OracleCacheImpl) {
//properties here
}
break
case Environment.LOCAL:
cacheBean(com.util.MockMapCache) {
//properties
}
break
}
}
答案 0 :(得分:1)
您可以尝试使用内置的Config.groovy
处理在environments {}
中设置bean定义,并通过application
属性分配定义。
所以在resources.groovy
:
beans = {
// Create a clone of the properties definition Closure
def cacheProps = application.config.cache.bean.props.clone()
cacheProps.delegate = this
cacheBean(application.config.cache.bean.class, cacheProps)
}
在Config.groovy
:
environments {
production {
cache.bean.class = com.util.OracleCacheImpl
cache.bean.props = {
//properties as in resources.groovy
}
}
'local' {
cache.bean.class = com.util.MockMapCache
cache.bean.props = {
//properties as in resources.groovy
}
}
'uat' {
//etc...
}
//etc...
}
再考虑一下,您可以将整个bean定义放在Config.groovy
Closure
中,并在resources.groovy中调用它
resources.groovy
beans = {
// Create a clone of the properties definition Closure
def cacheBeans = application.config.cache.beans.clone()
cacheBeans.delegate = this
cacheBeans()
}
Config.groovy
environments {
production {
cache.beans = {
cacheBean(com.util.OracleCacheImpl) {
//properties here
}
}
}
'local' {
cache.beans = {
cacheBean(com.util.MockMapCache) {
//properties here
}
}
}
'uat' {
//etc...
}
//etc...
}