Dagger:如何根据构建实例化不同的ObjectGraphs

时间:2013-09-12 13:01:25

标签: android dependency-injection object-graph dagger

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

我理解在你的类中,你不会直接实例化你的客户端代码所依赖的对象,而是用@Inject声明它,通过Module创建一个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脚本以使Module提供我想要的特定实现? (或选择正确的模块)......

谢谢。

1 个答案:

答案 0 :(得分:2)

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

你可以使用dagger以三种方式进行条件连接(不需要使用构建系统)。

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

  2. 为给定组件创建一个@Provides方法,该方法接受其依赖项中的所有潜在实现,并根据条件在提供时间间切换它们。

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

  4. 我倾向于推荐#1,因为你正在非常简单地构造每种情况的接线,并且你没有为不属于所选模块的模块和类加载适配器。 #2.1是我的第二选择,因为与#2不同,它最低限度地分配。其他人确实使得运行时非常繁重,并导致浪费的类加载和实例化/分配。