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 方式实现这一点感到有些困惑。我一直在考虑创建某种服务工厂,它会根据环境返回RestService
或FakeRestService
的实例,但如果我可以在配置中定义要注入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 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试
使用 Grails 3.0.3 将 springSecurityService 注入控制器