2012-12-24 31 views
9

मैंने एक ऑब्जेक्ट लागू करने वाली ऑब्जेक्ट को इंजेक्ट करने के लिए घोषणात्मक सेवाओं के साथ एक ओएसजीआई सेवा बनाई है। यदि मैं ऑब्जेक्ट को उस मॉडल में इंजेक्ट करता हूं जो एप्लिकेशन मॉडल (हैंडलर, पार्ट, ....) से जुड़ा हुआ है तो यह ठीक काम कर रहा है। अगर मैं इसे उस वर्ग में इंजेक्ट करता हूं जो एप्लिकेशन मॉडल से जुड़ा हुआ नहीं है तो यह हमेशा शून्य हो रहा है।कक्षा मॉडल में ग्रहण 4 डी का उपयोग कैसे करें जो अनुप्रयोग मॉडल से जुड़े नहीं हैं?

क्या कक्षाओं में डीआई का उपयोग करना संभव है जो एप्लिकेशन मॉडल से जुड़े नहीं हैं? मैंने vogella ट्यूटोरियल में देखा लेकिन किसी भी तरह से मुझे कोई समाधान नहीं मिला।

उत्तर

6

मैं कैसे ग्रहण 4 अपनी कक्षाओं में वस्तुओं इंजेक्षन कर सकते हैं के तीन तरीके के बारे में पता:

  1. स्टार्ट-अप ग्रहण रनटाइम के दौरान कक्षाओं यह को दर्शाता है में प्रासंगिक एनोटेशन के लिए लग रहा है।
  2. 1 में इंजेक्शन वाले ऑब्जेक्ट ट्रैक किए गए हैं और बदले जाने पर फिर से इंजेक्शन दिए जाएंगे।
  3. ContextInjectionFactory और IEclipseContext का उपयोग करके इंजेक्शन को मैन्युअल रूप से ट्रिगर करना।

आप जो चाहते हैं वह तीसरे विकल्प के साथ संभव हो सकता है। Here एक कोड उदाहरण है:

ManipulateModelhandler man = new ManipulateModelhandler(); 

    //inject the context into an object 
    //IEclipseContext iEclipseContext was injected into this class 
    ContextInjectionFactory.inject(man,iEclipseContext); 

    man.execute(); 

समस्या हालांकि है; कि IEclipseContext को पहले से ही उस वर्ग में इंजेक्शन देने की आवश्यकता है जो ऑब्जेक्ट की आवश्यकता वाले ऑब्जेक्ट तक पहुंच सके। आवश्यक इंजेक्शन की संख्या के आधार पर, प्रतिनिधिमंडल का उपयोग करने के लिए यह अधिक उपयोगी हो सकता है (टेस्टेबिलिटी एक तर्क होगा)।

@Inject 
    public void setFoo(Foo foo) { 
     //Bar is not attached to the e4 Application Model 
     bar.setFoo(foo); 
    } 

इसलिए, बेहतर समाधान शायद @Creatable एनोटेशन का उपयोग कर रहा है। बस अपनी कक्षा को एनोटेट करें, और इसे नो-तर्क कन्स्ट्रक्टर दें।

@Creatable 
    public class Foo { 
     public Foo() {} 
    } 

उपरोक्त विधि के रूप में उस प्रकार पर @Inject का उपयोग करना, ग्रहण इन्स्तांत जाने और इसे इंजेक्षन जाएगा। नुकसान यह है कि आप अब ऑब्जेक्ट सृजन को नियंत्रित नहीं कर सकते हैं, जैसा कि आप ContextInjectionFactory.inject (..) के साथ करेंगे।

+0

बस एक छोटा सा नोट है कि अधिकांश लोग javax.inject इंजेक्शन लगाने के लिए देख सकते हैं। को उस कक्षा में शामिल करें जिसमें इंजेक्शन वाले उदाहरणों की आवश्यकता होती है, 3. –

+1

के विकल्प के रूप में मुझे 'IEclipseContext' मिलता है यदि कथन 'ContextInjectionFactory.inject (मैन, iEclipseContext)' कक्षा में चल रहा है जो अनुप्रयोग मॉडल में परिभाषित नहीं है? – kenshinji

+0

@kenshinji शायद यह [उत्तर] (https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722) आपकी मदद करेगा। लेकिन यह इंगित करना महत्वपूर्ण है कि यह आपको _the_ संदर्भ नहीं देगा, बल्कि _a_ संदर्भ देगा। ग्रहण संदर्भ वस्तुओं का एक पेड़ रखता है, और उनमें से एक को आपके इच्छित मूल्यों में शामिल किया गया है या नहीं, आपके उपयोग के मामले पर निर्भर करता है। हो सकता है कि 'E4Aplication.createDefaultContext()' पर भी एक नज़र डालें। –

0

मैंने इसे प्राप्त करने के लिए ई (एफएक्स) क्लिपसे के कुछ हिस्से को दोबारा प्रतिक्रिया दी। this पर एक नज़र डालें। लापरवाह प्लग के लिए खेद है ...