gpt4 book ai didi

dependency-injection - Dagger 2 : how to change provided dependencies at runtime

转载 作者:行者123 更新时间:2023-12-04 01:11:12 25 4
gpt4 key购买 nike

为了学习 Dagger 2,我决定重写我的应用程序,但我一直坚持为以下问题找到合适的解决方案。

出于本示例的目的,假设我们有一个名为 Mode 的接口(interface)。 :

public interface Mode {
Object1 obj1();

//some other methods providing objects for app
}

和两个实现: NormalModeDemoMode .

模式存储在单例中,因此可以从应用程序中的任何位置访问它。
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在运行时(比方说,当用户在后台点击几次)
public void backgroundClicked5Times(){
ModeManager.INSTANCE.mode(new DemoMode());
//from now on every object that uses Mode will get Demo implementations, great!
}

所以首先我摆脱了单例并将模式定义为 Dagger 2 模块:
@Module
public class NormalModeModule {
@Provides
public Object1 provideObject1() {
return new NormalObject1();
}
}

@Module
public class DemoModeModule {
@Provides
public Object1 provideObject1() {
return new DemoObject1();
}
}

现在在方法 backgroundClicked5Times而不是处理单例,我想替换 NormalModeModuleDemoModeModule在 DAG 中,其他需要 Object1 的类会得到 DemoObject1即日起实现。

我怎样才能在 Dagger 中做到这一点?

提前致谢。

最佳答案

用 Dagger 试验了一段时间后,我想出了在我的用例中似乎运行良好的解决方案。

  • 定义将保存有关模式的状态信息的类
    public class Conf {
    public Mode mode;

    public Conf(Mode mode) {
    this.mode = mode;
    }

    public enum Mode {
    NORMAL, DEMO
    }
    }
  • 提供 Conf 的单例实例在模块
    @Module
    public class ConfModule {
    @Provides
    @Singleton
    Conf provideConf() {
    return new Conf(Conf.Mode.NORMAL);
    }
    }
  • 将模块添加到 AppComponent
    @Singleton
    @Component(modules = {AppModule.class, ConfModule.class})
    public interface AppComponent {
    //...
    }
  • 定义基于Mode提供不同对象的模块
    @Module
    public class Object1Module {

    @Provides
    Object1 provideObject1(Conf conf) {
    if (conf.mode == Conf.Mode.NORMAL)
    return new NormalObject1();
    else
    return new DemoObject1();
    }
    }
  • 要在运行时切换模式,只需注入(inject) Conf对象并修改它:
    public class MyActivity extends Activity {
    @Inject Conf conf;

    //...

    public void backgroundClicked5Times(){
    conf.mode = Conf.Mode.DEMO;

    //if you have dagger objects in this class that depend on Mode
    //execute inject() once more to refresh them
    }
    }
  • 关于dependency-injection - Dagger 2 : how to change provided dependencies at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41084333/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com