Как использовать Spring DSL в Groovy для внедрения зависимости от среды (dev, qa, prod)? - PullRequest
1 голос
/ 07 декабря 2011

Мы создали веб-приложение в Grails / Groovy. В Groovy мы создали подключаемый компонент кэширования для обеспечения кэширования больших потоков HTTP-ответов в приложении Grails. Мы хотим внедрить реализацию кэша во время выполнения в зависимости от среды, например, когда разработчик выполняет какую-то локальную работу, внедряет простой кэш на основе карты, но в операционной среде, внедряет базу данных кэша RDBMS, вы понимаете.

Мы нашли эту ссылку в учебнике Grails, в котором используется SWITCH, и, похоже, он работает, но он уродлив и громоздок. У нас есть более 5 различных сред (local, dev, test, 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 
    }
}

1 Ответ

1 голос
/ 08 декабря 2011

Вы можете попытаться установить определения вашего компонента в Config.groovy, используя встроенную обработку environments {}, и назначить определения с помощью свойства 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...
}

Подумав немного дольше, вы, вероятно, можете поместить все определение компонента в Config.groovy Closure и вызвать его в виде ресурсов.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...
}
...