【问题标题】:Dagger 2 inject subcomponent.builderDagger 2 注入 subcomponent.builder
【发布时间】:2022-09-30 02:20:33
【问题描述】:

我看到一些代码正在注入SubComponent.Builder。例如:


class MyClass @Inject constructor(val mySubcomponentBuilder: MySubComponent.Builder) { 

    fun someFunc(knownAtRuntime: String) {
        mySubcomponentBuilder.withSomethingIKnowAtRuntime(knownAtRuntime).build()
    }    
}

为什么我们(以及我们应该在哪里/何时)这样做(即注入 subcomponent.builders)?

这种类型的辅助注入是不是我们可以在图上提供我们只在运行时才知道的实例?

    标签: dagger-2 dagger subcomponent


    【解决方案1】:

    是的,子组件构建器有点像辅助注入,但用于可注入 Dagger 依赖项的整个子图。

    什么是子组件?

    Subcomponents 是从父组件派生的附加组件。在 Guice 中,它们类似于 child injectors;在 Dagger 1 中,它们类似于 subgraphs。它们允许您在父绑定之上添加其他绑定,如通过附加模块指定的那样。

    从它们允许来自不同图的绑定的意义上说,它们可以与component dependencies 进行比较,但它们是与父组件同时生成的,并且可以透明地使用父组件中定义的绑定。 dagger.android 和 Hilt 包都使用子组件。

    每个组件都可以有自己的scope,子组件也不例外:您可能会看到@Singleton ApplicationComponent,其子组件为@RequestScope RequestComponent(用于服务器)或@ActivityScope ActivityComponent(用于Android)。每个请求或活动都会获得自己的组件实例。这将允许您注入@RequestScoped MetricsService@ActivityScoped User,它们将是同一请求/活动中的相同实例,但请求/活动之间的实例不同。

    什么是子组件构建器?

    如果子组件具有非空构造函数,则子组件可能需要实例化模块,或者它们可能需要通过@BindsInstance 绑定实例。子组件Builders 允许您像指定Component Builder 一样指定那些。

    您还可以选择使用Subcomponent.Factory,类似于Component.Factory,但将所有Builder 参数作为一个方法调用的参数。

    为什么我要注入子组件构建器?有哪些替代方案?

    尽管您可以将子组件声明为factory methods specified on the parent component,但这会阻止 Dagger 修剪未使用的依赖项,因为它看不到谁在请求子组件。通过declaring subcomponents on modules 并将它们的构建器注入到图中,如果您根本不调用它们,Dagger 可以删除整个子组件。

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多