Grails

2012-12-19 23 views
10

में गतिशील रूप से एक सेवा का चयन कैसे करें मेरे नियंत्रक से मैं गतिशील रूप से पैरामीटर के आधार पर एक सेवा का चयन करना चाहता हूं।Grails

वर्तमान में मेरे पास आधार सेवा और कुछ अन्य सेवाएं हैं जो इस बेस सेवा को सीमित करती हैं। मैं एक वर्ग है कि करता है एक सेम परम के आधार पर नाम बनाता है और अंत में निम्नलिखित कॉल फोन पैरामीटर के आधार पर:

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

}

यह सेवा मैं चाहता हूँ देता है। हालांकि मैं इसे इस तरह से गंदे महसूस कर रहा हूं। क्या किसी के पास कुछ पैरामीटर के आधार पर सेवा (या कोई अन्य बीन) प्राप्त करने के लिए बेहतर तरीका है?

धन्यवाद।

उत्तर

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

होगा लेकिन तब यह है कि मैं परेशान नहीं होता तो आसान है सहायक वर्ग के साथ सभी :)