2012-12-19 25 views
10

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

目前我有一个基本服务和一些其他服务,扩大这种基本服务。基于参数我打电话,做一个类创建基于帕拉姆一个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)?

谢谢。

回答

13

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

return ctx.getBean(beanName) 

,这将是相同的,但不神奇。

既然你从控制器或服务调用此,我想跳过ServletContextHolder的东西,并通过获取上下文依赖注入的grailsApplication豆(def grailsApplication),并通过def ctx = grailsApplication.mainContext得到它。然后将它传递到这个辅助类(记得春天的一大范例是依赖注入,而不是老派的依赖性拉),然后它会简单地

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

但随后它是如此简单,我不会理会与帮手类在所有:)