डैगर 2 सीखने के लिए मैंने अपने आवेदन को फिर से लिखने का फैसला किया लेकिन मैं निम्नलिखित समस्या के लिए उचित समाधान ढूंढने के साथ अटक गया हूं।डैगर 2: रनटाइम पर प्रदत्त निर्भरताओं को कैसे बदलें
इस उदाहरण के प्रयोजन के मान लेते हैं कि हम एक अंतरफलक Mode
कहा जाता है जाने के लिए:
public interface Mode {
Object1 obj1();
//some other methods providing objects for app
}
और दो कार्यान्वयन: NormalMode
और DemoMode
।
मोड सिंगलटन में संग्रहीत किया जाता है ताकि इसे एप्लिकेशन के भीतर कहीं से भी एक्सेस किया जा सके।
public enum ModeManager {
INSTANCE,;
private Mode mode;
public Mode mode() {
if (mode == null)
mode = new NormalMode();
return mode;
}
public void mode(Mode mode) { //to switch modules at runtime
this.mode = mode;
}
}
NormalMode
रनटाइम पर DemoMode
स्विच किया गया है (मान लें, जब समय की पृष्ठभूमि जोड़ी पर उपयोगकर्ता clickcs)
public void backgroundClicked5Times(){
ModeManager.INSTANCE.mode(new DemoMode());
//from now on every object that uses Mode will get Demo implementations, great!
}
तो सबसे पहले मैं सिंगलटन से छुटकारा और के रूप में परिभाषित मोड गया डैगर 2 मॉड्यूल:
@Module
public class NormalModeModule {
@Provides
public Object1 provideObject1() {
return new NormalObject1();
}
}
@Module
public class DemoModeModule {
@Provides
public Object1 provideObject1() {
return new DemoObject1();
}
}
अब विधि backgroundClicked5Times
में सिंगलटन से निपटने के लिए मैं NormalModeModule
को DemoModeModule
के साथ डीएजी में बदलना चाहता हूं, इसलिए Object1
की अन्य कक्षाओं को अब से DemoObject1
कार्यान्वयन मिलेगा।
मैं डैगर में ऐसा कैसे कर सकता हूं?
अग्रिम धन्यवाद।
की [डैगर साथ swappable मॉड्यूल संभावित डुप्लिकेट 2] (https://stackoverflow.com/questions/35658488/swappable-modules-with-dagger-2) – tir38