2012-12-19 12 views
10

Dal mio controller vorrei selezionare dinamicamente un servizio basato su un parametro.Come selezionare dinamicamente un servizio in Grails

Attualmente ho un servizio di base e alcuni altri servizi che estendono questo servizio di base. In base al parametro che io chiamo una classe che fa crea un nome di fagioli basato sul param e alla fine chiama il seguente:

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

}

Questo restituisce il servizio che voglio. Tuttavia mi sento piuttosto sporco a farlo in questo modo. Qualcuno ha un modo migliore per gestire l'ottenimento di un servizio (o qualsiasi altro bean) basato su alcuni parametri?

Grazie.

risposta

13

ctx."${beanName}" viene aggiunto al metralletto ApplicationContext in modo da poter fare cose come def userService = ctx.userService. E 'solo una scorciatoia per ctx.getBean('userService') così si potrebbe cambiare il codice per

return ctx.getBean(beanName) 

e sarebbe lo stesso, ma meno magico.

Dal momento che si sta chiamando questo da un controller o di un servizio, mi piacerebbe saltare la roba ServletContextHolder e ottengo il contesto dalla dipendenza-iniettando il grailsApplication fagioli (def grailsApplication) e ottenere via def ctx = grailsApplication.mainContext. Poi passare in questa classe di supporto (ricordate il grande paradigma della primavera è l'iniezione di dipendenza, non vecchia scuola di dipendenza-trazione) e quindi sarebbe semplicemente

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

Ma allora è così semplice che non mi preoccuperei con la classe helper :)

Problemi correlati