代码之家  ›  专栏  ›  技术社区  ›  Michael Vescovo

android架构蓝图“todo–mvp–dagger”,哪里有@provides for tasksrepository?

  •  3
  • Michael Vescovo  · 技术社区  · 6 年前

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

    我试图理解dagger2的实现,但我似乎不明白他们是如何让dagger2提供任务定位的。

    他们有 @Provides 对于“providetaskslocaldatasource”和“providetasksremotedatasource”,但是实际的taskrepository在哪里?

    在todoapplication类中,它们有:

    @Inject
    TasksRepository tasksRepository;
    

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

    如果我尝试在自己的应用程序中使用相同的方法,则会出现以下错误:

    如果没有@provides-或@products注释的方法,则无法提供

    所以我在蓝图代码里到处找,但我看不出他们自己是怎么做到的。有什么诀窍可以让他们 @提供 ?它肯定会建起来,所以他们不知怎么绕过它。

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

    我是最新提交的,在撰写本文时是“082bd72d62472f9caad2979046067fb928bbef”。

    1 回复  |  直到 6 年前
        1
  •  6
  •   David Rawson B Aristide    6 年前

    在你提到的存储库中,匕首2知道如何注入 TasksRepository 通过被标记为 @Inject . 从 source :

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

    因为构造函数是用 @注入 ,匕首2将尝试使用构造函数注入 任务定位 消费者喜欢 TodoApplication .

    自从 TasksDataSource 已经被束缚住了 TasksRepositoryModule 有足够的信息可以让匕首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;
    
    }
    

    匕首2可以注射 Foo 里面 AppCompatActivity . 为什么?

    1. 匕首2知道如何构造 Bar 对象(通过调用空构造函数)
    2. 匕首2知道当创建 它必须使用带注释的构造函数 @注入 只有一个参数 酒吧
    3. 没有其他依赖项 ,换句话说,完整的对象图可用。