2011-01-25 8 views
26

मुझे एक कक्षा को दो इंटरफेस के कार्यान्वयन के रूप में बांधने की आवश्यकता है। और इसे सिंगलटन गुंजाइश में बांधना चाहिए।Google Guice के साथ कुछ इंटरफेस में एक कार्यान्वयन कैसे बाध्य करें?

मैंने क्या किया है:

bind(FirstSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 
bind(SecondSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 

लेकिन, जाहिर है, यह दो अलग-अलग विविधताएं के सृजन की ओर जाता है, क्योंकि वे विभिन्न कुंजियों से आबद्ध कर रहे हैं।

मेरा सवाल यह है कि मैं यह कैसे कर सकता हूं?

public class DefaultSettings implements FirstSettings, SecondSettings 
{ 
} 

मान लीजिए कि आप एक वर्ग EngineA और EngineB

public class EngineA 
{ 
    @Inject 
    private FirstSettings settings; 
} 

public class EngineB 
{ 
    @Inject 
    private SecondSettings settings; 
} 

करते हैं और आप एक ही इंजेक्षन करना चाहते हैं:

उत्तर

50

गुइस की विकी में a documentation about this use case है।

मूलतः, यह आपको क्या करना चाहिए है:

// Declare that the provider of DefaultSettings is a singleton 
bind(DefaultSettings.class).in(Singleton.class); 

// Bind the providers of the interfaces FirstSettings and SecondSettings 
// to the provider of DefaultSettings (which is a singleton as defined above) 
bind(FirstSettings.class).to(DefaultSettings.class); 
bind(SecondSettings.class).to(DefaultSettings.class); 

कोई किसी भी अतिरिक्त कक्षाएं निर्दिष्ट करने के लिए की जरूरत है: बस Provider रों के मामले में लगता है और जवाब नहीं बल्कि स्वाभाविक रूप से आता है।

+1

सबसे सुरुचिपूर्ण समाधान! –

2

तो, DefaultSettings दोनों FirstSettings और SecondSettings, यानी के एक कार्यान्वयन है कार्यान्वयन।

आप एक इंटरफेस DefaultSettingsInterface

public interface DefaultSettingsInterface extends FirstSettings, SecondSettings 
{ 
} 

घोषित करने और DefaultSettings लागू DefaultSettingsInterface

public class DefaultSettings implements DefaultSettingsInterface 
{ 
} 

कर सकते हैं तो फिर विन्यास हो सकता है:

bind(FirstSettings.class).to(DefaultSettingsInterface.class); 
bind(SecondSettings.class).to(DefaultSettingInterface.class); 
bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class); 
+1

धन्यवाद, बोरिस! मेरा मानना ​​है कि आपका समाधान काम करता है! मुझे अभी अपने आप से एक और तरीका मिला है: बाइंड (फर्स्टसेटिंग.क्लास)। से (DefaultSettings.class)। (सिंगलटन.क्लास) में; बाइंड (सेकेंडसेटिंग.क्लास)। से (फर्स्टसेटिंग.क्लास)। (सिंगलटन.क्लास) में; ऐसा लगता है कि यह भी काम करता है। आपको क्या लगता है? – Pavel

+1

मुझे नहीं पता था कि फर्स्टसेटिंग सेकेंड सेटिंग्स को बढ़ाती है। उस स्थिति में यह मान्य और बहुत छोटा है। अपने समाधान को उत्तर के रूप में पोस्ट करें और कुछ समय बाद इसे सर्वश्रेष्ठ के रूप में प्रचारित करें :) –

+0

हां, यह सच है। मेरी गलती, मैंने इसका उल्लेख नहीं किया :) – Pavel

3

समाधान, मैंने पाया है:

bind(FirstSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 
bind(SecondSettings.class). 
    to(FirstSettings.class). 
    in(Singleton.class); 

यह मेरे मामले में काम करता है, क्योंकि सेकेंडसेटिंग फर्स्टसेटिंग को बढ़ाता है।

+1

केवल तभी काम करता है जब सेकेंडसेटिंग उप-वर्ग है, फर्स्टसेटिंग का सबइंटरफेस। इस मामले और अन्य के लिए समाधान हैं जहां फर्स्टसेटिंग और सेकेंड सेटिंग्स के बीच कोई लिंक मौजूद नहीं है। –

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