Grails根据环境将服务注入Controller

时间:2015-03-20 15:05:27

标签: spring grails dependency-injection

我在控制器中遇到了if(Environment.Current == Environment.PRODUCTION)块中的代码片段,因为代码块在methodA中调用restService进行REST调用到仅在将应用程序部署到特定生产服务器时可用的URL。但是这样做意味着在运行测试时代码区域无法访问,这让我有点不舒服。

在开发环境中,我并不关心拨打methodA的问题,因为我会剔除methodA将返回的内容并将其传递给下一个Controller,因此,将if语句更改为if(Environment.Current != Environment.DEVELOPMENT)可以让我更好地测试代码,而不必调用我在开发期间无法访问的地方。

理想情况下,我想尝试将服务注入到依赖于grails环境的Controller中;所以我可以有两个这样的服务:

class RestService {
  def methodA() {
    // go do a REST call
  }
}

class FakeRestService() {
  def methodA() {
    // return some stubbed response
  }
}

在我的控制器restService中将是开发和测试环境中FakeRestService的实例,以及PRODUCTION中RestService的实例

class SearchController {
  def restService

  def index() {
    restService.methodA()
  }

我对如何用Grailsy' / Spring方式实现这一目标感到有些困惑。我一直在寻找创建某种服务工厂,它会根据环境返回RestServiceFakeRestService的实例,但如果我能定义要注入的服务,那将会很好在配置中的restService或类似的东西。

任何建议都会很棒!

2 个答案:

答案 0 :(得分:3)

当环境为TEST时,您可以在resources.groovy中为bean名称添加别名。

import grails.util.Environment

beans = {
    if ( Environment.current == Environment.TEST ) {
        springConfig.addAlias 'restService', 'fakeRestService'
    }
}

RuntimeSpringConfiguration位于resources.groovy getSpringConfig()

答案 1 :(得分:0)

这是dmahapatro答案的更多Grails-y版本:

import grails.util.Environment

beans = {
    Environment.executeForCurrentEnvironment {
        environments {
            development {
                springConfig.addAlias 'restService', 'fakeRestService'
            }
        }
    }
}