看一下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);
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方法,这通常是一个名为void
的inject
方法。这将填充所有@Inject
注释字段,并在您传入的实例上调用所有@Inject
注释方法。如果GitHubApp具有@Inject
-annotated-fields(and it does),则调用inject
可以跳过定义所有getter组件。这将以上所有代码减少为:
DaggerAppComponent.builder().application(githubApp)
.build().inject(githubApp)
...这是你在演示中看到的。
@BindsInstance
告诉Dagger它应该将应用程序注入它在依赖图中找到的@Inject Application
中。
第二个要求Dagger将依赖关系注入到@Inject
注释的字段和方法中。这是依赖图的根。
从技术上讲,可以根据需要多次调用组件方法,而构建器方法只能调用一次。