【发布时间】:2016-12-11 08:37:33
【问题描述】:
为了学习 Dagger 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(比如说,当用户在后台单击cs几次时)
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 方法中,我想在 DAG 中用 DemoModeModule 替换 NormalModeModule 而不是处理单例,这样其他需要 Object1 的类将从现在开始获得 DemoObject1 实现。
如何在 Dagger 中做到这一点?
提前致谢。
【问题讨论】:
标签: dependency-injection dagger-2