डैगर 2 का उपयोग करके, मैं एक सिंगल स्कोप में एकाधिक स्थानों पर सिंगलटन ऑब्जेक्ट इंजेक्ट करने की कोशिश कर रहा हूं। हालांकि, ऐसा लगता है कि मेरा समाधान हर बार एक नया उदाहरण बनाता है।डैगर 2 सिंगलेट्स काम नहीं कर रहे
इस परीक्षण प्रोजेक्ट में, मेरे पास मुख्य एक्टिविटी है जो डैगर मॉड्यूल को प्रारंभ करती है। डैगर मॉड्यूल ऑब्जेक्ट बॉक्स और बिल्ली प्रदान करता है, जिसमें बॉक्स ले जाने वाला बिल्ली पैरामीटर के रूप में होता है। मैं अपनी मुख्य गतिविधि में बिल्ली भी लेता हूं। अंत में, मैं इंजेक्शन वाले दोनों बिल्ली चर (क्रमशः बॉक्स में और मुख्य गतिविधि में) के संदर्भों की जांच करता हूं, लेकिन वे एक ही उदाहरण नहीं हैं।
यदि मैं इसके बजाय मेरी मुख्य क्रिया में दो बार प्रदान करता हूं, तो वही उदाहरण प्रदान किया जाता है।
MainActivity:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerModule daggerModule = new DaggerModule();
DaggerComponent daggerComponent = Dagger_DaggerComponent.builder()
.daggerModule(daggerModule).build();
// Same Cat instance returned.
Cat cat1 = daggerComponent.provideCat();
Cat cat2 = daggerComponent.provideCat();
Log.d("=== cat1: ", cat1.toString());
Log.d("=== cat2: ", cat2.toString());
// Different Cat instance returned. Why?
Box box = daggerComponent.provideBox();
Log.d("=== box cat: ", box.getCat().toString());
}
}
@Module
public class DaggerModule {
@Provides
@Singleton
public Cat provideCat() {
return new Cat();
}
@Provides
@Singleton
public Box provideBox() {
return new Box(provideCat());
}
}
@Singleton
@Component(modules = { DaggerModule.class })
public interface DaggerComponent {
Cat provideCat();
Box provideBox();
}
public class Cat {
@Inject
public Cat() {
}
}
public class Box {
private Cat mCat;
@Inject
public Box(Cat cat) {
mCat = cat;
}
public Cat getCat() {
return mCat;
}
}
अग्रिम धन्यवाद!
संपादित करें: यह काम करता है अगर provideBox बजाय सीधे provideBox के भीतर से provideCat बुलाने की एक बिल्ली बहस में लेता है और बॉक्स बनाने के लिए है कि का उपयोग करता है,।
// Doesn't work, new Cat instance created.
@Provides
@Singleton
public Box provideBox() {
return new Box(provideCat());
}
बनाम
// Works, same singleton injected.
@Provides
@Singleton
public Box provideBox(Cat cat) {
return new Box(cat);
}
क्या MainActivity में provideCat बुला और DaggerModule में provideBox के भीतर से यह कर के बीच अंतर है? क्या यह हो सकता है कि डैगर कंपाइलर डैगर मॉड्यूल को बाहरी वर्गों के साथ समान तरीके से संसाधित नहीं करता है और अगर मैं वहां प्रदान करता हूं तो एनोटेशन लागू नहीं होते हैं?
व्यवहार अलग है कारण यह है कि उदाहरण प्रबंधन घटक कार्यान्वयन द्वारा मॉड्यूल नहीं है। जब आप सीधे विधि का आह्वान करते हैं, तो यह केवल इसे किसी भी अन्य जावा विधि की तरह कॉल करने जा रहा है, लेकिन जब आप घटक तार को एक साथ निर्भर करते हैं तो यह सुनिश्चित करने के लिए कि केवल एक उदाहरण है, यह 'dagger.internal.ScopedProvider' का उपयोग करेगा। – gk5885
इसके अलावा, 'इंजेक्शन' वाले प्रकारों के लिए, आप सीधे '@ सिंगलटन' के साथ कक्षा (इस मामले में 'बिल्ली' और 'बॉक्स') को एनोटेट कर सकते हैं और' @ प्रोविड 'विधियों से पूरी तरह से बच सकते हैं। – gk5885
जानकारी और टिप के लिए धन्यवाद! – Johe