本文翻译自 Dagger 2 for Android Beginners — DI part II。
这个故事是该系列的第三部分,适用于 Android 初学者的 Dagger 2。 如果您没有阅读上一篇文章,可以从这里开始。
系列目录
- 适用于 Android 初学者的 Dagger 2 - 简介
- 适用于 Android 初学者的 Dagger 2 - DI 第一部分
- 适用于 Android 初学者的 Dagger 2 - DI 第二部分(你在这里)
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 第一部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 第二部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 进阶第一部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 进阶第二部分
Dagger2 前情回顾..
在上一讲中,我们对依赖关系和依赖注入进行了更深入的讨论。 我们还看到了一个例子 - 私生子之战,在这个例子中我们用硬依赖创造了类 War。
注意:如果你对我讲故事的方式感到不舒服 - 保持j将 权力的游戏 作为概念,请在后续阅读中随意更改类的名称。
使用龙玻璃
让我们回顾一下前面的例子 - 私生子之战。 War
类有两个依赖:Boltons
和 Starks
。
public class War {
private Starks starks;
private Boltons boltons;
public War(){
starks = new Starks();
boltons = new Boltons();
starks.prepareForWar();
starks.reportForWar();
boltons.prepareForWar();
starks.reportForWar();
}
}
现在是时候用龙玻璃杀死 White Walkers 了。 是的,我们将使用依赖注入概念来消除硬依赖。
回顾一下依赖注入,类本身不应该创建或持有它的依赖。相反,它需要从外部获取。因此让我们从外部将依赖 Starks
和 Boltons
带给类 War。
public class War {
private Starks starks;
private Boltons boltons;
//DI - 通过构造函数从其他地方获取依赖关系
public War(Starks starks, Boltons bolton){
this.starks = starks;
this.boltons = bolton;
}
public void prepare(){
starks.prepareForWar();
boltons.prepareForWar();
}
public void report(){
starks.reportForWar();
boltons.reportForWar();
}
}
上面的例子是构造函数 DI 的一种形式。 我知道你们当中的很多人会认为我已经在我的项目中完成了这项工作。 是的,你是对的。 我们中的许多人在不知情的情况下使用 DI 概念。
此外,类 War 不仅应该知道如何执行某项任务,还应该知道在哪里找到完成它所需要的合作者。 相反,如果我们向对象提供执行其工作所需的一切,那么之前的问题就会消失。 该类可以轻松地与不同的协作者一起工作,并且可以单独进行测试。 在依赖于依赖注入的应用程序中,对象永远不必寻找依赖关系或自己构造它们。 所有依赖项都提供给它们或注入到它们,以便它们可以使用。
当然,在某些时候,必须有人实例化依赖项,并将它们实际提供给可能需要它们的对象。这个阶段通常在应用程序的入口点完成。例如,在正常的 Java 应用程序中,将在 main()
方法中找到此代码,如下所示。在 Android 上,可以在活动的 onCreate()
方法中完成。
public class BattleOfBastards {
public static void main(String[] args){
Starks starks = new Starks();
Boltons boltons = new Boltons();
War war = new War(starks,boltons);
war.prepare();
war.report();
}
}
这是 BattleOfBastards
类,我们在这里创建依赖 Starks
和 Boltons
,并通过构造函数将它们注入到 War
类中 - 因为 War
依赖于依赖项 Starks
和 Boltons
。
现在,是时候欣赏自己并庆祝了 - 是的! 我们杀死了 White Walkers 的艰难依赖。 希望您了解我们正在努力实现的目标。
有关完整代码,请参阅以下分支。 该项目是在 IntelliJ 中编写的 - 只是一个普通的 Java 项目。
总结
在这一讲中,我们理解该类本身不应该创建或持有自己的依赖。 相反,它需要从外部获取依赖。
我们还看到了简单依赖注入的计划。 我们以私生子之战为例,试图通过 DI 消除对 class 的严重依赖。
下一步是什么?
在下一讲,我们将更多地讨论 Dagger 2 库 - 它的注解,当我们面临更为复杂的情况时,它将如何使 DI 的工作更容易。