Grails根据环境将Service注入Controller

Grails inject Service into Controller dependant on environment

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

在开发环境中,我不关心对 methodA 的调用,因为我正在删除 methodA 会 return 并将其传递给下一个控制器,因此将 if 语句更改为 if(Environment.Current != Environment.DEVELOPMENT) 可以让我更好地测试代码,而不必调用我在开发过程中无法到达的地方。

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

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

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

在我的控制器中 restService 在开发和测试环境中是 FakeRestService 的实例,在生产环境中是 RestService 的实例

class SearchController {
  def restService

  def index() {
    restService.methodA()
  }

我对如何以 'Grailsy'/Spring 方式实现这一目标感到困惑。我一直在研究创建某种服务工厂,它将 return RestServiceFakeRestService 的实例取决于环境,但如果我能定义什么服务就好了在配置或类似的东西中注入 restService

任何建议都会很棒!

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

import grails.util.Environment

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

RuntimeSpringConfigurationgetSpringConfig() 在 resources.groovy 中提供。

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

import grails.util.Environment

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