Guice's HelpedInject का उपयोग कैसे करें?


84

मैंने https://github.com/google/guice/wiki/AssistedInject पढ़ा है , लेकिन यह नहीं कहता है कि असिस्टेड इनजेक्ट के तर्कों के आधार पर कैसे पास किया जाए। इंजेक्टर.गेट इंन्सटेंस () कॉल कैसा दिखेगा?


संबंधित, नीचे दिए गए उत्तर उन मामलों को कवर नहीं कर रहे हैं जहां वह एक ही प्रकार का कई बार उपयोग किया जाता है। stackoverflow.com/questions/23553865/…
अलेक्जेंडर ओह

जवाबों:


168

FactoryModuleBuilder वर्ग के javadoc की जाँच करें ।

AssistedInjectआपको अपने आप को Factoryकोड करने के बजाय गतिशील रूप से कक्षा के लिए कॉन्फ़िगर करने की अनुमति देता है । यह अक्सर उपयोगी होता है जब आपके पास एक ऐसी वस्तु होती है जिसमें एक निर्भरता होती है जिसे इंजेक्ट किया जाना चाहिए और कुछ पैरामीटर जिन्हें ऑब्जेक्ट के निर्माण के दौरान निर्दिष्ट किया जाना चाहिए।

प्रलेखन से उदाहरण एक है RealPayment

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

देखें कि CreditServiceऔर AuthServiceकंटेनर द्वारा इंजेक्ट किया जाना चाहिए, लेकिन शुरुआत और राशि को एक निर्माता द्वारा उदाहरण के निर्माण के दौरान निर्दिष्ट किया जाना चाहिए।

तो बजाय एक इंजेक्शन लगाने की Paymentआप एक इंजेक्शन कर रहे हैं PaymentFactoryपैरामीटर के रूप में चिह्नित कर रहे हैं साथ @AssistedमेंRealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

और एक कारखाने को बांधना चाहिए

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

कॉन्फ़िगर किए गए कारखाने को आपकी कक्षाओं में इंजेक्ट किया जा सकता है।

@Inject
PaymentFactory paymentFactory;

और आपके कोड में उपयोग किया जाता है

Payment payment = paymentFactory.create(today, price);

8
बहुत कुछ किया और मेरे संदेह को अधिक संक्षिप्त और स्पष्ट व्याख्या नहीं मिल सकी। बहुत धन्यवाद
गब्बर

18
जीथब पर प्रलेखन की तुलना में यह समझना आसान है। बहुत बढ़िया।
अरबाजबार २३'१६ को

8
इसकी तुलना में गितुब प्रलेखन बकवास है।
EMM

2
क्या 'भुगतान' करने की विधि कॉल में 'तारीख' और 'राशि' पास नहीं होनी चाहिए? उन्हें यहां निर्माता में क्यों इंजेक्ट किया जाना चाहिए?
हर्षित

2
आश्चर्य करने वालों के लिए, RealPaymentइंटरफ़ेस लागू करने की आवश्यकता नहीं है।
१२:०१
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.