0

我正在尝试使用 Dagger 学习依赖注入。

我知道在您的类中,您不会直接实例化客户端代码所依赖的对象,而是使用@Inject 声明它,通过模块创建 ObjectGraphs,并从 ObjectGraph 中获取对象:

  @Inject CoffeeMaker coffeeMaker;

  public static void main(String[] args) {
    ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
    CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class);
    ....
  }

但是,所有这些代码现在都取决于您用于创建 ObjectGraph 的模块(在此示例中为 DripCoffeeModule)。

现在我想在我的 Android 应用程序中使用它。对于调试版本,我想要我的类的特定实现,对于发布版本,实现会有所不同。

我该怎么做?如何设置 build.xml ant 脚本以使模块提供我想要的特定实现?(或选择正确的模块)...

谢谢你。

4

1 回答 1

3

您可以在构建系统时执行此操作,但您将在构建规则中选择性地创建模块,并且您最终可能会意外地破坏一些编译时约束。

您可以仅使用 dagger 以三种方式进行条件连接(无需使用构建系统)。

  1. 为每组配置创建一个顶级模块,其中包括提供某些实现的所有更具体的模块 - 一个用于测试,一个用于此计费结构,一个用于此。在生产 Dex 文件中包含所有运行时顶级模块,并在图形配置时在它们之间进行选择。

  2. 为给定组件创建一个 @Provides 方法,该方法在其依赖项中获取所有可能的实现,并在配置时根据条件在它们之间切换。

    1. 与 #2 一样,但 @Provides 方法依赖于 Lazy,因此依赖组件的创建仅发生在配置时实际选择的组件上,而永远不会创建其他组件。
  3. 创建给定组件的包装器实现,它将其他可能的实现作为依赖项,并且组件在运行时委托给适当的组件。

我倾向于推荐#1,因为您正在非常狭窄地构建每种情况的接线,并且您没有为不在选定模块中的模块和类加载适配器。#2.1 是我的第二选择,因为与 #2 不同,它的分配最少。其他的确实让事情在运行时变得很繁重,并导致浪费的类加载和实例化/分配。

于 2013-09-16T02:38:37.710 回答