从此处查看 Android 架构蓝图“todo‑mvp‑dagger”:https://github.com/googlesamples/android-architecture .
我试图了解 Dagger2 的实现,但我似乎无法弄清楚他们如何让 Dagger2 提供 TasksRepository。
他们有 @Provides 用于“provideTasksLocalDataSource”和“provideTasksRemoteDataSource”,但实际的 TaskRepository 在哪里?
在 TodoApplication 类中,他们有这个:
@Inject
TasksRepository tasksRepository;
它如何在没有@Provides 的情况下将它注入(inject)到任何地方?
如果我尝试在我自己的应用程序中使用相同的方法,我会收到此错误:
cannot be provided without an @Provides- or @Produces-annotated method
所以我到处查看蓝图代码,但我看不到他们自己是如何做到的。是否有一些技巧可以让他们没有 @Provides?它肯定会构建,所以他们已经以某种方式绕过了它。
有人在实际的 github 页面上问过同样的问题,但在撰写本文时没有答案。 https://github.com/googlesamples/android-architecture/issues/561 .
我正在进行最新的提交,在撰写本文时是“082bd72d62472f9caadd2979046067fb928bbfef”。
最佳答案
在您提到的存储库中,Dagger 2 知道如何注入(inject) TasksRepository通过标有 @Inject 的构造函数.来自source :
@Inject
TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,
@Local TasksDataSource tasksLocalDataSource) {
mTasksRemoteDataSource = tasksRemoteDataSource;
mTasksLocalDataSource = tasksLocalDataSource;
}
由于构造函数被注释为 @Inject , Dagger 2 将尝试使用构造函数注入(inject) TasksRepository像TodoApplication这样的消费者.
自 TasksDataSource已经绑定(bind)在TasksRepositoryModule有足够的信息让 Dagger 2 执行注入(inject)而无需额外的负担 @Provides或 @Binds方法。
同样,您可以执行以下操作:
class Foo {
private final Bar bar;
@Inject
Foo(Bar bar) {
this.bar = bar;
}
}
class Bar {
@Inject
Bar() {}
}
class Activity extends AppCompatActivity {
@Inject Foo foo;
}
而 Dagger 2 将能够注入(inject) Foo里面AppCompatActivity .为什么?
Bar对象(通过调用空构造函数)Foo 的实例时知道它必须使用注释为 @Inject 的构造函数使用单个参数 Bar .Foo 没有其他依赖关系,换句话说,完整的对象图可用。关于java - Android Architecture Blueprints "todo‑mvp‑dagger",@Provides for TasksRepository 在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50869969/