如何在 Grails 中动态选择服务

Posted

技术标签:

【中文标题】如何在 Grails 中动态选择服务【英文标题】:How to dynamically select a service in Grails 【发布时间】:2012-12-07 00:53:39 【问题描述】:

我想从我的控制器中根据参数动态选择服务。

目前我有一个基础服务和一些其他服务来扩展这个基础服务。根据参数,我调用了一个类,该类确实根据参数创建 bean 名称并最终调用以下内容:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA

class Resolver 
    def ctx

def getBean(String beanName) 
    if(!ctx) 
        ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
    
    return ctx."$beanName"

这将返回我想要的服务。但是我觉得这样做很脏。有没有人有更好的方法来处理基于某些参数获取服务(或任何其他 bean)?

谢谢。

【问题讨论】:

【参考方案1】:

ctx."$beanName" 被添加到ApplicationContext 元类中,因此您可以执行def userService = ctx.userService 之类的操作。这只是ctx.getBean('userService') 的快捷方式,因此您可以将代码更改为

return ctx.getBean(beanName)

它会是一样的,但不那么神奇。

由于您是从控制器或服务调用它,我会跳过 ServletContextHolder 的内容并通过依赖注入 grailsApplication bean (def grailsApplication) 并通过 def ctx = grailsApplication.mainContext 获取上下文来获取上下文.然后将它传递给这个辅助类(记住 Spring 的大范式是依赖注入,而不是老式的依赖拉取),然后就很简单了

class Resolver 
   def getBean(ctx, String beanName) 
      ctx.getBean(beanName)
   

但是它是如此简单,以至于我根本不会打扰助手类:)

【讨论】:

以上是关于如何在 Grails 中动态选择服务的主要内容,如果未能解决你的问题,请参考以下文章

Grails 或 Play 如何检测更改和热重载类?

Grails 2 服务中的多个动态数据源

环境特定的 Grails 服务配置

如何在Grails 3.2中测试服务中事件的触发?

您如何在 grails 2.3 中测试服务或控制器方法

如何在 Grails 4.0.3 中导入专有库