2009-08-03 9 views
11

क्या आपको एक ही अंतर्निहित प्रकार के 2 सिंगलटन उदाहरण मिल सकते हैं?एक ही प्रकार के एकाधिक गुइस सिंगलेट्स प्राप्त करना

यह वसंत ऋतु में स्पष्ट रूप से तुच्छ है क्योंकि यह नामित उदाहरणों पर आधारित है जहां आप एक गुंजाइश संलग्न करते हैं लेकिन मैं गुणा में बराबर नहीं देख सकता जो कार्यान्वयन कक्षाओं के लिए बाध्यकारी प्रकारों के बारे में है। ध्यान दें कि मैं उदाहरण के साथ बाध्य नहीं करना चाहता क्योंकि प्रश्नों के उदाहरणों को अन्य निर्भरताओं के साथ इंजेक्शन दिया जाता है।

उत्तर

15

गुइस में भी आसान है! दो बिता व्याख्या बनाएँ, @One और @Two और फिर

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton()); 
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton()); 

हैं और कहते हैं तो

@Inject 
public SomethingThatDependsOnSingletons(@One MySingleton s1, 
    @Two MySingleton t2) { ... } 
+0

या एक @Provides विधि अगर यह निर्भरता है, मैं डॉक्स के इस बिट याद किया (http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) निर्भरता कर सकते हैं विधि के पैरामीटर के रूप में पारित किया जाना चाहिए। इंजेक्टर विधि का आह्वान करने से पहले इनमें से प्रत्येक के लिए बाइंडिंग का प्रयोग करेगा। – Matt

+0

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

+2

@ फिलिप, मैंने कोशिश की कि आप क्या सुझाव दे रहे हैं, और दोनों टिप्पणियों के लिए एक ही उदाहरण प्राप्त किया। मैंने 'बाइंड (माईसिंगलेटन.क्लास) का उपयोग किया। एनोटेटेड (वन। क्लास) .to (MySingleton.class) .in (सिंगलटन.क्लास); बाइंड (MySingleton.class) .annotatedWith (Two.class) .to (MySingleton.class) .in (सिंगलटन.क्लास)। ' –

13

मैं, मार्सिन की प्रतिक्रिया पूरक जोड़ने आप toInstance() का उपयोग कर अपने आप को सीमित करने के लिए की जरूरत नहीं है कि द्वारा करना चाहते हैं या ऐसी स्थिति में प्रदाता विधियों।

निम्नलिखित बस के रूप में अच्छी तरह से काम करेगा:

bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class); 

[...]

@Inject 
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... } 

Guice जब MartyMcFly और DocBrown कक्षाएं instantiating हमेशा की तरह निर्भरता इंजेक्षन जाएगा।


नोट यह भी काम करता है कि जब आप एक ही प्रकार के कई एकमात्र बाध्य करने के लिए चाहते हैं:

bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class); 

इसके लिए काम करने के लिए, आप यह सुनिश्चित करें कि Person सिंगलटन में बाध्य नहीं है बनाना चाहिए गुंजाइश मॉड्यूल में या @Singleton एनोटेशन के साथ स्पष्ट रूप से दायरा। this Gist में अधिक जानकारी।

संपादित करें: उदाहरण के रूप में मैं जो नमूना कोड देता हूं वह Guice Grapher Test से आता है। गुइस परीक्षणों को देखते हुए एपीआई का उपयोग करने के तरीके को बेहतर ढंग से समझने का एक शानदार तरीका है (जो अच्छी इकाई परीक्षणों के साथ प्रत्येक प्रोजेक्ट पर भी लागू होता है)।

+1

मुझे उदाहरण पसंद है –

+0

धन्यवाद जेसी :) नमूना कोड मैं वास्तव में अपने बिंदु को चित्रित करने के लिए उपयोग करता था गुइस ग्रैपर एक्सटेंशन के लिए एक परीक्षण से आता है। मैंने सोचा कि यह मजाकिया था और इसे चिपकाया गया है। मुझे स्रोत के लिए एक लिंक रखना चाहिए था, हालांकि (मैं अभी यह करूँगा)। एक तरफ, मुझे आपके ब्लॉग और विशेष रूप से आपके व्यावहारिक लेख गुइस/Google संग्रह (http://publicobject.com/) पर पसंद हैं। हमें आपके जैसे अधिक ब्लॉग चाहिए। तो, इसके लिए भी धन्यवाद। –

+0

@eneveu, आप सुझाव देते हैं कि आपका समाधान मार्सीन का विकल्प है। ऐसा लगता है कि आपके द्वारा वर्णित उपयोग केस उसके मुकाबले अलग है, क्योंकि आपका मानना ​​है कि एक ठोस (चालक) वर्ग के दो उदाहरणों के विपरीत दो अलग-अलग ड्राइवर कार्यान्वयन वर्ग (मार्टीएमसीएफली, डॉकब्रॉउन) हैं। जब मैं बाद के मामले में इस तकनीक का उपयोग करने की कोशिश करता हूं, तो मुझे इसका उपयोग करके एक ही सिंगलटन के दो संदर्भ मिलते हैं: 'बाइंड (माईसिंगलेटन.क्लास) .notatedWith (One.class) .to (MySingleton.class) .in (Singleton.class); बाइंड (MySingleton.class) .annotatedWith (Two.class) .to (MySingleton.class) .in (सिंगलटन.क्लास); ' –

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