Grails 根据环境将 Service 注入到 Controller

Posted

技术标签:

【中文标题】Grails 根据环境将 Service 注入到 Controller【英文标题】:Grails inject Service into Controller dependant on environment 【发布时间】:2015-05-24 01:11:59 【问题描述】:

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

在开发环境中,我不关心调用methodA,因为我正在删除methodA 将返回的内容并将其传递给下一个控制器,因此将if 语句更改为@987654326 @ 允许我更好地测试代码,而不必调用我在开发期间无法到达的地方。

理想情况下,我想尝试将服务注入依赖于 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 方式实现这一点感到有些困惑。我一直在考虑创建某种服务工厂,它会根据环境返回RestServiceFakeRestService 的实例,但如果我可以在配置中定义要注入restService 的服务会很好或类似的东西。

任何建议都会很棒!

【问题讨论】:

【参考方案1】:

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

import grails.util.Environment

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

RuntimeSpringConfiguration 在 resources.groovy 中由 getSpringConfig() 提供。

【讨论】:

很好的优雅解决问题。谢谢!!【参考方案2】:

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

import grails.util.Environment

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

【讨论】:

以上是关于Grails 根据环境将 Service 注入到 Controller的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Grails 服务注入 src/groovy 类

Grails+Xfire 搭建Web Service环境

如何在 Grails 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试

使用 Grails 3.0.3 将 springSecurityService 注入控制器

关于spring中无法将service注入到servlet中的问题

在 grails-app 之外的 Grails 类中注入日志对象