1

我有一个应用程序,其中包含一堆产品风格,基本上是单个应用程序的白标签。但是,有时,由于客户想要一些稍微不同的东西,因此在某些方面与主要流程有一些分歧。到目前为止,我们一直在为这些案例编辑代码并使用意大利面条代码(大量的 if 和 else)来确保其他应用程序不会中断。不用说,这不是一种非常可扩展(甚至是理智)的方式来做到这一点。

一种选择是在 productFlavor 源文件夹中编写活动类,即src/flavor1/java/AnActivity.java,src/flavor2/java/AnActivity.java等。由于 productFlavor 代码不能覆盖这些src/main类,因此即使没有自定义,这也需要为每个新风味复制相同的类。我不太喜欢这个选项。它导致大量冗余代码和类名最终不再具有描述性,因为它们都必须具有相同的名称才能覆盖其他名称,即使它们可能正在做不同的事情。

另一种选择可能是使用类似的东西为不同的实现Dagger构建ObjectGraph和注入意图。例如,如果是flavor1,当单击按钮 X 时,将注入一个意图ActivityA,如果是flavor2,则注入一个意图ActivityB

这似乎是一种更好的方法,但我仍然不确定如何实现将覆盖默认绑定的类ObjectGraph

关于实现或其他选项的任何想法?我不受约束Dagger,我刚刚开始研究依赖注入和测试,以便其他框架也能正常工作。

4

1 回答 1

5

这就是我要做的...

src/flavor1/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor1Module(app)
    };
  }
}

src/flavor2/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor2Module(app)
    };
  }
}

src/main/java/com/myapp/MyAppApplication.java

ObjectGraph og = ObjectGraph.create(Modules.get(this));

MyAppModule有共同的依赖。Flavor1Module并且Flavor2Module可以贡献额外的依赖项或覆盖来自MyAppModuleif的依赖项overrides=true

于 2013-10-13T03:20:29.067 回答