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

Why double inject an Android Application in Dagger?

查看 Android 架构组件示例 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);

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

第二个要求 Dagger 将依赖项注入它的 @Inject-注释字段和方法。这是依赖图的根。

从技术上讲,组件方法可以调用任意多次,而构建器方法只能调用一次。

,你有两个不同的方向要设置:你想让 Dagger 图知道如何到达你的 Application 实例,你想从依赖中获得对某些绑定的访问图。

Builder 中的 @BindsInstance 行为应用程序集创建了一个绑定到您传入的实例。听起来您理解了这一部分。

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

@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.

但是,您也可以创建一个单参数方法,通常是一个名为 injectvoid 方法。这将填充所有 @Inject-注释字段,并在您传入的实例上调用所有 @Inject-注释方法。如果 GitHubApp 具有 @Inject-注释字段(and it does),对 inject 的调用让您可以跳过定义组件上的所有 getter。将上述所有代码减少为:

DaggerAppComponent.builder().application(githubApp)
    .build().inject(githubApp)

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