为什么要在Dagger中双重注入Android应用程序?

时间:2018-08-30 01:14:21

标签: dagger-2 android-architecture-components dagger

看一下Android Architecture Components示例GithubBrowerSample的源代码,我不明白两次注入githubApp的意义。

inject方法不够吗?为什么它需要在同一句子中都使用它们?

public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance Builder application(Application application);
        AppComponent build();
    }
    void inject(GithubApp githubApp);
}

他们像这样使用它

public static void init(GithubApp githubApp) {
        DaggerAppComponent.builder().application(githubApp)
                .build().inject(githubApp);

2 个答案:

答案 0 :(得分:2)

@BindsInstance告诉Dagger,应该将应用程序注入依赖关系图中找到的任何@Inject Application中。

第二个请求Dagger将依赖项注入到带有@Inject注释的字段和方法中。这是依赖关系图的根。

从技术上讲,component方法可以随意调用多次,而builder方法只能调用一次。

答案 1 :(得分:2)

As Thomas Broyer described,您需要设置两个单独的方向:您希望Dagger图知道如何到达您的Application实例,并且您希望从依赖关系图中访问某些绑定。

Builder中的@BindsInstance行为您传入的实例创建Application绑定。听起来像您了解这部分。

但是,创建组件后,大概想使用。假设您要从图中获取类Dep1,Dep2和Dep3的完全注入的实例。一种方法是在Component上创建获取实例的方法:

@Singleton @Component(/* ... */) interface AppComponent {
    // [builder snipped out here]

    fun getDep1(): Dep1
    fun getDep2(): Dep2
    fun getDep3(): Dep3
}

然后将它们称为创建应用的一部分。

var appComponent = DaggerAppComponent.builder().application(githubApp).build()
var dep1 = appComponent.getDep1()
var dep2 = appComponent.getDep2()
var dep3 = appComponent.getDep3()
// Use dep1, dep2, and dep3 here.

但是,您也可以创建一个单一参数方法,通常是称为void的{​​{1}}方法。这将填充所有inject注释字段,并在您传入的实例上调用所有@Inject注释方法。如果GitHubApp具有@Inject注释字段({{3} }),对@Inject的调用使您可以跳过在组件上定义所有getter的操作。这样可以将上述所有代码减少为:

inject

...这就是您在演示中看到的内容。