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

Mic*_*ovo 3 java android kotlin dagger dagger-2

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

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

它们具有@Provides"provideTasksLocalDataSource"和"provideTasksRemoteDataSource",但实际TaskRepository的位置在哪里?

在TodoApplication类中,他们有:

@Inject
TasksRepository tasksRepository;
Run Code Online (Sandbox Code Playgroud)

怎么能在没有@Provides的情况下注入它呢?

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

如果没有@ Provide-或@ Produces-annotated方法,则无法提供

所以我在Blueprints代码中到处寻找,但我看不出他们是如何做到的.是否有一些技巧允许他们没有@Provides?它肯定会建立起来,所以他们以某种方式绕过它.

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

我在撰写本文时的最新提交是"082bd72d62472f9caadd2979046067fb928bbfef".

Dav*_*son 6

在你提到的存储库中,Dagger 2知道如何TasksRepository通过标记的构造函数注入@Inject.从来源:

@Inject
TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,
        @Local TasksDataSource tasksLocalDataSource) {
    mTasksRemoteDataSource = tasksRemoteDataSource;
    mTasksLocalDataSource = tasksLocalDataSource;
}
Run Code Online (Sandbox Code Playgroud)

由于构造函数带有注释@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;

}
Run Code Online (Sandbox Code Playgroud)

而Dagger 2将能够注入Foo内部AppCompatActivity.为什么?

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