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

问题描述 投票:0回答:2

看一下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);
dagger-2 android-architecture-components dagger
2个回答
2
投票

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

Builder中的@BindsInstance行为Application set创建了一个绑定到你传入的实例。听起来你理解这一部分。

但是,在您创建组件后,可能您想要使用它。假设您希望从图中获得完全注入的类Dep1,Dep2和Dep3的实例。您可以这样做的一种方法是在Component上创建获取实例的方法:

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

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

然后你将它们称为App创建的一部分。

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.

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

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

...这是你在演示中看到的。


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.