2010-05-11 15 views
5

मैं डोमेन संपत्ति के आधार पर सेवा इंजेक्षन करने की जरूरत है, अब तक मैं निम्नलिखित के साथ आया था:Grails: गतिशील रूप से डोमेन कक्षा में सेवा इंजेक्षन

ApplicationHolder.application.getServiceClass("package.${property}Service").clazz 

लेकिन यह इस तरह से यह इंजेक्षन नहीं है लोड हो रहा है निर्भर सेवाओं है । क्या मैं इसे गलत कर रहा हूँ?

उत्तर

15

नए उदाहरण वसंत के निर्भरता प्रबंधन को बाईपास करेंगे; आपको एप्लिकेशन संदर्भ से कॉन्फ़िगर किए गए सिंगलटन बीन को प्राप्त करने की आवश्यकता है। बजाय इस का उपयोग करें:

def service = ApplicationHolder.application.getMainContext().getBean("${property}Service") 

मान लिया गया है कि 'संपत्ति' एक सेवा, FooBarService के लिए अर्थात के लिए आंशिक सेम नाम है, संपत्ति 'foobar' होना होगा। यदि यह 'FooBar' है तो आप GrailsNameUtils.getPropertyName उपयोग कर सकते हैं() इसे ठीक करने के:

import grails.util.GrailsNameUtils 

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service' 
def service = ApplicationHolder.application.getMainContext().getBean(beanName) 
+0

हाँ, यह काम करता है। मैंने बीन विधि प्राप्त करने की कोशिश की, लेकिन इसे 'फूबार' पास कर रहा था :) – rukoche

+0

उपर्युक्त मेरे लिए काम नहीं कर रहा था जब तक कि मैंने '.getMainContext.' को '.getMainContext.'' से बदल दिया। – sebnukem

+0

धन्यवाद, मैंने इसे देखने के बाद इसे ठीक किया संपादित किया गया था गलत तरीके से –

0

हां। सेवाओं को डोमेन ऑब्जेक्ट्स में इंजेक्शन नहीं दिया जाता है। यदि आपके डोमेन ऑब्जेक्ट को किसी विशेष उपयोग मामले के लिए कुछ चाहिए, तो उस सेवा का उपयोग करने वाली सेवा को डोमेन ऑब्जेक्ट की ओर से दूसरी सेवा का आह्वान करें।

+2

किसी भी वसंत बीन को नियंत्रकों की तरह डोमेन कक्षाओं में इंजेक्शन दिया जा सकता है, यानी "def fooService"। इसके लिए सामान्य उपयोग केस कस्टम सत्यापनकर्ता में एक सेवा को कॉल करना है। –

+0

हो सकता है; मैं बस असहमत हूं कि यह होना चाहिए। एक वैध खाता किसी डोमेन ऑब्जेक्ट से खाता या व्यक्ति जैसा भिन्न होता है। यह एक पूरी तरह से अलग उपयोग मामले है। – duffymo

3

IMHO डोमेन वर्गों सब पर तर्क नहीं होना चाहिए (अलग प्रमाणकों के फार्म)।

अपनी परियोजनाओं में मैं सामान्य रूप से प्रत्येक डोमेन श्रेणी (उदाहरण UserService वर्ग उपयोगकर्ता के लिए) के लिए एक सेवा बना सकते हैं और मैं टुकड़े कि सामान्य रूप से डोमेन कक्षा में किया जाएगा में यहां तक ​​कि छोटे टुकड़े वहाँ के सारे तर्क छड़ी,।

मुझे लगता है कि जावा/सी ++ दुनिया से आने वाले बहुत से प्रोग्रामर इस बदसूरत को ढूंढते हैं, लेकिन यह Grails आर्किटेक्चर को बेहतर बनाता है।

+3

यह सच है कि Grails डोमेन कक्षा तर्क के लिए वास्तव में उपयुक्त नहीं हैं, लेकिन यह एक शर्म की बात है क्योंकि मुझे इस पर फाउलर से सहमत होना है: http://en.wikipedia.org/wiki/Anemic_Domain_Model – Kimble

+1

वास्तव में , एरिक इवांस को शायद बल में परेशानी महसूस हुई, जब कोई कहता है कि "डोमेन कक्षाओं में तर्क नहीं होना चाहिए"। यह एक डोमेन ऑब्जेक्ट एंटी-पैटर्न की तरह लगता है और डोमेन-संचालित डिज़ाइन से पूरी तरह से काउंटर है। –

+0

मेरे मामले में, मैं grails पर्यावरण के आधार पर एक सूचकांक टीटीएल सेट करना चाहता हूँ। इसके लिए एक बेहतर पैटर्न क्या है? – Kirby

संबंधित मुद्दे