2010-08-04 20 views
10

द्वारा बनाई नहीं मैं एक वर्ग तो तरह है, कि मैं अपने आप को मेरे कोड में कहीं बनाएँ:Guice इंजेक्षन फील्ड Guice

class StarryEyes { 
    @Inject MyValidator validator; 

    public StarryEyes(String name) { 
     //.. 
    } 

    public doSomething() { 
     // validator is NULL 
    } 
} 

मैं Guice सत्यापनकर्ता का एक उदाहरण इंजेक्षन करना चाहते हैं, जो एक @Singleton है एनोटेशन। मैं एक मॉड्यूल है कि स्टार्टअप पर लोड है और यह लाइन में शामिल हैं:

bind(MyValidator.class); 

हालांकि, यह के रूप में "सत्यापनकर्ता" काम करने के लिए प्रतीत नहीं होता है हमेशा रिक्त है। मैंने कई बदलावों की कोशिश की है जैसे:

bind(MyValidator.class)toInstance(new MyValidator()); 

या ऐसी अन्य चीजें। क्या यह नहीं है कि गुइस को कैसे काम करना है?

उत्तर

33

आम तौर पर गुइस को इंजेक्ट करने के लिए वस्तुओं को बनाने की आवश्यकता होती है। यदि आप बस new StarryEyes(name) पर कॉल करते हैं, तो गुइस उस ऑब्जेक्ट को कभी नहीं देख पाएगा, इसलिए यह इंजेक्ट करने में सक्षम नहीं होगा। एक चीज जो आप कर सकते हैं उसे ऑब्जेक्ट पर injector.injectMembers(obj) पर कॉल करने के बाद कॉल करना है। मैं इसकी अनुशंसा नहीं करता, हालांकि, आपको अपने कोड में इंजेक्टर का संदर्भ देने से बचना चाहिए।

आप वास्तव में यहां क्या चाहते हैं Assisted Inject है। प्रदान की

@Inject public StarryEyes(MyValidator validator, @Assisted String name) 

कि क्या मतलब है, कि validator एक पैरामीटर है कि Guice इंजेक्षन चाहिए है, जबकि name चाहिए "सहायता" हो (जो है,: असिस्टेड इंजेक्षन के साथ, आप इस तरह अपने वर्ग के लिए कुछ निर्माता की घोषणा करता हूँ उस समय उदाहरण बनाया गया है)।

public interface StarryEyesFactory { 
    StarryEyes create(String name); 
} 

असिस्टेड इंजेक्षन के साथ, Guice तो आप के लिए है कि कारखाने को लागू कर सकते हैं:

फिर आप इस तरह एक अंतरफलक पैदा करते हैं। आप इसे इस तरह बाँध:

bind(StarryEyesFactory.class).toProvider(
    FactoryProvider.newFactory(StarryEyesFactory.class, StarryEyes.class)); 

फिर आप इंजेक्षन एक StarryEyesFactory कहीं भी आप इसे का एक उदाहरण बनाना चाहते हैं। जहां आप पहले new StarryEyes(name) कहलाते थे, अब आप starryEyesFactory.create(name) पर कॉल करते हैं। जब आप कारखाने पर create(name) पर कॉल करते हैं, तो यह नाम ले जाएगा और इसे निर्माता को पास कर देगा और बाध्य सत्यापनकर्ता स्वयं प्रदान करेगा।

install(new FactoryModuleBuilder().build(StarryEyesFactory.class)); 
:

Guice 3 में प्रारंभ हो, तो आप इस एक FactoryModuleBuilder का उपयोग करते हैं

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