【发布时间】:2017-07-18 12:36:15
【问题描述】:
我正在尝试了解 dagger2 并在我的应用中实现。我已经阅读了很多关于它的好处。除非并且直到我完全理解它,否则我无法在我的应用中获得它的好处。
我了解@Module 和@Inject。让我感到困惑的是@Component。我有几个与此相关的问题。
Module 提供对象实例,Inject 使用它。为什么我们需要介于两者之间的组件?真的有必要弥补差距吗?我们可以有没有任何方法的空接口组件吗?
模块类真的需要构造函数吗?如果模块类中没有构造函数,是否可以使用空构造函数初始化模块类?
为什么我们不能直接实例化模块类并构建依赖图,而不是创建组件然后初始化它?
-
目前在组件接口中我只见过两种方法
一个。无效注入(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -
无效注入(); - 组件还会生成依赖图吗?
我们是否可以从其他类而不是活动或服务或片段中注入类似的东西 -
无效注入(DataManager dataManager);
如果 DataManager 是一个单例实例会怎样?
b.改造 getRetrofit();这种方法和上面的方法有什么区别?为什么这不带任何输入参数?
我读到@Singleton 只是匕首中的一个作用域。我们如何才能真正创建一个在应用程序的生命周期中存在的单例对象?
-
假设有一个我想使用 dagger 构建的 DataManager 实例。它只有一个依赖项。我为此编写了一个模块类和一个组件接口。如果我想在 MainActivity 中使用它,我将它用作
@Inject DataManager 数据管理器;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();
}
我想在许多其他活动中使用此数据管理器,但我不想这样做 单身人士。我想将它保留在我使用它的当前活动范围内。所以我 将使用
@Inject 数据管理器数据管理器;
获取该实例。我是不是该 写
DataManagerComponent.Builder...........在我使用@Inject DataManager dataManager 的每个活动 oncreate() 中?如果非要这样写, 它会不会创建比简单地使用更多的样板代码
DataManager dataManager = new DataManager();
-
假设有 4 个对象,它们相互依赖,例如 D 依赖 C,C 依赖 B 等等。
D -> C -> B -> A
假设我已经编写了模块类并为所有 4 个提供了方法。如果 我尝试在任何 ActivityA 中注入 D,例如
@Inject D d;
C、B、A 会自动实例化吗?
假设在 ActivityB 中我只需要注入 B。如果我注入 B 喜欢
@Inject B b;
匕首会再次创造B和A吗?还是会使用已经存在的 创建?
如果有人花时间回答我的所有问题,我将不胜感激。我不期待详细的答案。如果它澄清了这个概念,那很好。期待回复。提前致谢。
【问题讨论】:
-
请查看下面的回复
-
我讨厌匕首,我宁愿使用 Koin 更好,而不是那么复杂地弄清楚事情的去向。匕首就像是用看不见的线添加蜘蛛网。
标签: android dependency-injection dagger-2 dagger android-mvp