为什么要在 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.
但是,您也可以创建一个单参数方法,通常是一个名为 inject
的 void
方法。这将填充所有 @Inject
-注释字段,并在您传入的实例上调用所有 @Inject
-注释方法。如果 GitHubApp 具有 @Inject
-注释字段(and it does),对 inject
的调用让您可以跳过定义组件上的所有 getter。将上述所有代码减少为:
DaggerAppComponent.builder().application(githubApp)
.build().inject(githubApp)
...这就是您在演示中看到的内容。
查看 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
-注释字段和方法。这是依赖图的根。
从技术上讲,组件方法可以调用任意多次,而构建器方法只能调用一次。
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.
但是,您也可以创建一个单参数方法,通常是一个名为 inject
的 void
方法。这将填充所有 @Inject
-注释字段,并在您传入的实例上调用所有 @Inject
-注释方法。如果 GitHubApp 具有 @Inject
-注释字段(and it does),对 inject
的调用让您可以跳过定义组件上的所有 getter。将上述所有代码减少为:
DaggerAppComponent.builder().application(githubApp)
.build().inject(githubApp)
...这就是您在演示中看到的内容。