10

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

目前我有一个基础服务和一些其他服务来扩展这个基础服务。基于参数,我调用了一个类,该类确实基于参数创建了一个 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)?

谢谢你。

4

1 回答 1

13

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

return ctx.getBean(beanName)

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

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

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

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

于 2012-12-19T16:29:53.327 回答