Android架构蓝图“todo-mvp-dagger”,哪里是@Provides for TasksRepository?

时间:2018-06-15 06:06:36

标签: java android kotlin dagger-2 dagger

从这里查看Android架构蓝图“todo-mvp-dagger”:https://github.com/googlesamples/android-architecture

我正在尝试理解Dagger2的实现,我似乎无法弄清楚他们是如何让Dagger2提供TasksRepository的。

对于“provideTasksLocalDataSource”和“provideTasksRemoteDataSource”,它们有EnvironmentError但实际的TaskRepository是哪一个?

在TodoApplication类中,他们有:

@Provides

如果没有@Provides,它如何在任何地方注入它?

如果我尝试在自己的应用程序中使用相同的方法,我会收到此错误:

  如果没有@ Provide-或@ Produces-annotated方法

,则无法提供

所以我在蓝图代码中到处寻找,但我看不出他们是如何做到的。是否有一些技巧可以让他们没有@Inject TasksRepository tasksRepository; ?它肯定会建立起来,所以他们已经以某种方式解决了它。

有人在实际的github页面上问了同样的问题,但在撰写本文时没有答案。 https://github.com/googlesamples/android-architecture/issues/561

我正在撰写最新的提交内容,其中包括“082bd72d62472f9caadd2979046067fb928bbfef”。

1 个答案:

答案 0 :(得分:6)

在您提到的存储库中,Dagger 2知道如何通过标有TasksRepository的构造函数注入@Inject。来自source

@Inject
TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,
        @Local TasksDataSource tasksLocalDataSource) {
    mTasksRemoteDataSource = tasksRemoteDataSource;
    mTasksLocalDataSource = tasksLocalDataSource;
}

由于构造函数使用@Inject注释,Dagger 2将尝试使用构造函数将TasksRepository注入TodoApplication等消费者。

由于TasksDataSource已绑定TasksRepositoryModule,因此有足够的信息让Dagger 2执行注射,而无需额外@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将能够在Foo内注入AppCompatActivity。为什么?

  1. Dagger 2知道如何构造Bar对象(通过调用空构造函数)
  2. Dagger 2知道在创建Foo的实例时,必须使用带有@Inject注释的构造函数和单个参数Bar
  3. Foo没有其他依赖关系,换句话说,完整的对象图可用。