2016-02-05 9 views
11

उदाहरण के लिए, RESTEasy's ResteasyWebTarget क्लास में proxy(Class<T> clazz) है, जैसे इंजेक्टर के getInstance(Class<T> clazz)। क्या गुइस को यह बताने का कोई तरीका है कि कुछ वर्गों के निर्माण को कुछ उदाहरणों में सौंपा जाना चाहिए?गुइस इंजेक्टर से दूसरे कारखाने में कुछ कक्षाओं के निर्माण का प्रतिनिधि कैसे बनें?

मेरा लक्ष्य Guice के निम्नलिखित व्यवहार है: जब इंजेक्टर वर्ग एक का एक नया उदाहरण के लिए कहा जाता है, यह दृष्टांत करने की कोशिश; अगर तात्कालिकता असंभव है, तो कक्षा को तुरंत चालू करने के लिए किसी अन्य ऑब्जेक्ट (ई। जी। रीस्टेसी वेबटेक्स्ट इंस्टेंस) से पूछें।

मैं इस तरह एक मॉड्यूल लिखने के लिए करना चाहते हैं:

@Override 
protected void configure() { 
    String apiUrl = "https://api.example.com"; 
    Client client = new ResteasyClientBuilder().build(); 
    target = (ResteasyWebTarget) client.target(apiUrl); 

    onFailureToInstantiateClass(Matchers.annotatedWith(@Path.class)).delegateTo(target); 
} 

बजाय

@Override 
protected void configure() { 
    String apiUrl = "https://api.example.com"; 
    Client client = new ResteasyClientBuilder().build(); 
    target = (ResteasyWebTarget) client.target(apiUrl); 

    bind(Service1.class).toProvider(() -> target.proxy(Service1.class); 
    bind(Service2.class).toProvider(() -> target.proxy(Service2.class); 
    bind(Service3.class).toProvider(() -> target.proxy(Service3.class); 
} 

मैं इंजेक्टर इंटरफ़ेस को लागू करने और एक बच्चे के रूप में इंजेक्टर कि कार्यान्वयन का उपयोग के बारे में सोचा है, लेकिन इंटरफेस में बहुत अधिक तरीके हैं।

I कुछ पैकेज में सभी एनोटेटेड इंटरफेस को समझाते हुए एक विधि लिखते हैं और गुइस को उनके लिए प्रदाता का उपयोग करने के लिए कह रहे हैं, लेकिन यह बैकअप दृष्टिकोण है।

उत्तर

2

गुइस इसका समर्थन नहीं करता है, इसके लिए आपके सुनने के लिए कोई हुक नहीं है। हुक इसे प्रदान करता है (ProvisionListener & TypeListener) अगर एक बाध्यकारी नहीं पाया जा सकता है कहा जाता है नहीं मिलता।

मैं कुछ पैकेज में सभी एनोटेटेड इंटरफेस को समझाते हुए एक विधि लिख सकता हूं और गुइस को उनके लिए प्रदाता का उपयोग करने के लिए कह सकता हूं, लेकिन यह बैकअप दृष्टिकोण है।

यह आपका एकमात्र विकल्प है। वैकल्पिक इंजेक्शन केवल तभी काम करते हैं जब आप अपने target.proxy को कोडबेस पर प्यार करने के इच्छुक हैं।

संपादित करें (2017/02/28): यदि आप ऐसा करने जा रहे हैं, मैं पहले से ही मूल बातें यह मेरी magic-provider-guice परियोजना के हिस्से के रूप में ऐसा करने के लिए, उदाहरण के साथ JDBI और Feign के लिए किया है।

इंजेक्टर इंटरफ़ेस को लागू करने और एक बच्चे के रूप में इंजेक्टर कि कार्यान्वयन का उपयोग

मैं तुम्हें एक बच्चे इंजेक्टर (बस Guice मॉड्यूल का एक सेट के साथ एक बनाने के है) सेट कर सकते हैं पर विश्वास नहीं है, तो यह होगा या तो काम नहीं करते हैं।

+0

ठीक है, आपका उत्तर शायद यहां एकमात्र सही है। यह अन्यथा आप, यह मिल गया होता है कि के लिए खेद इनाम के लिए बहुत देर हो चुकी,। –

1

https://github.com/google/guice/wiki/Injections वैकल्पिक इंजेक्शन देखें, आप इसके साथ एक पतन वापस कर सकते हैं।

+0

नहीं, यह समाधान नहीं है। वैकल्पिक के साथ, मेरे पास कुछ निश्चित फ़ॉलबैक मान होना चाहिए। मेरे मामले में वापस आने लगती है, मान लें, गतिशील और अग्रिम में नहीं जाना जाता है। या हो सकता है कि मैं कुछ याद कर रहा हूँ - तुम कुछ संकेत कैसे Webtargets साथ Optionals उपयोग करने के लिए दे सकता है? –

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