2012-12-19 18 views
10

Z mojego kontrolera chciałbym dynamicznie wybrać usługę na podstawie parametru.Jak dynamicznie wybierać usługę w Grails

Obecnie mam usługę podstawową i niektóre inne usługi w zakresie tej usługi podstawowej. Na podstawie parametru nazywam klasą, która nie tworzy nazwę fasoli w oparciu o param i ostatecznie wywołuje następujące:

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

}

ta zwraca usługę chcę. Jednak czuję się dość brudno robiąc to w ten sposób. Czy ktoś ma lepszy sposób radzenia sobie z uzyskiwaniem usługi (lub jakiejkolwiek innej fasoli) w oparciu o jakiś parametr?

Dziękuję.

Odpowiedz

13

ctx."${beanName}" został dodany do metaklasy ApplicationContext, dzięki czemu można robić rzeczy takie jak def userService = ctx.userService. To tylko skrót do ctx.getBean('userService') więc można zmienić swój kod do

return ctx.getBean(beanName) 

i byłoby to samo, ale mniej magiczne.

Skoro jesteś nazywając to ze sterownika lub usługi, chciałbym pominąć ServletContextHolder rzeczy i dostać kontekst przez zależność-wstrzykiwanie grailsApplication Bean (def grailsApplication) i coraz to poprzez def ctx = grailsApplication.mainContext. Następnie przekazać go do tej klasy pomocnika (pamiętaj wielki paradygmat wiosny jest zależność wtrysku, a nie zależność ciągnięcie old-school) i wtedy byłoby po prostu

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

Ale wtedy jest to tak proste, że nie przeszkadza z klasą pomocników :)

Powiązane problemy