如何在Grails中动态选择服务

时间:2012-12-19 16:02:06

标签: spring grails dependency-injection grails-2.0

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

目前我有一个基本服务和一些其他服务来扩展这个基本服务。基于参数,我调用一个类,该类根据param创建一个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 个答案:

答案 0 :(得分:13)

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)
   }
}

但是它很简单,我根本不打扰帮助类:)