我看到了一些正在注入SubComponent.Builder的代码。例如:
class MyClass @Inject constructor(val mySubcomponentBuilder: MySubComponent.Builder) {
fun someFunc(knownAtRuntime: String) {
mySubcomponentBuilder.withSomethingIKnowAtRuntime(knownAtRuntime).build()
}
}为什么我们(以及我们应该在什么地方/什么时候)这样做(即注入subcomponent.builders)?
这种情况是否类似于辅助注入,在这种情况下,我们可以提供只在运行时才知道的图形上需要的实例?
发布于 2022-09-29 18:20:33
是的,子组件生成器有点像辅助注入,但是对于整个可注入的Dagger依赖子图。
什么是子组件?
子组分是从父组件派生的附加组件。在Guice中,它们类似于儿童注射器;在Dagger 1中,它们类似于子图。它们允许您在父绑定的基础上添加其他绑定,就像通过其他模块指定的那样。
从某种意义上说,它们允许来自不同图的绑定,可以将它们与组件依赖进行比较,但它们是与父组件同时生成的,并且可以透明地使用父组件中定义的绑定。dagger.android和Hilt包都使用子组件。
每个组件都可以有自己的作用域,子组件也不例外:您可能会看到一个带有@RequestScope RequestComponent子组件的@Singleton ApplicationComponent用于服务器,而@ActivityScope ActivityComponent则用于Android。每个请求或活动都会得到自己的组件实例。这将允许您注入一个@RequestScoped MetricsService或@ActivityScoped User,它将是同一个请求/活动中的同一个实例,但在请求/活动之间却是不同的实例。
什么是子组件构建器?
如果子组件具有非空构造函数,则可能需要对模块进行实例化,或者它们可能需要通过@BindsInstance绑定实例。子组件Builder允许您像为组件生成器那样指定这些组件。
您还可以选择使用类似于Subcomponent.Factory的Component.Factory,但使用所有的Builder参数作为一个方法调用的参数。
为什么要注入子组件构建器?有什么可供选择的?
尽管您可以将子组件声明为在父组件上指定的工厂方法,但这阻止了Dagger删除未使用的依赖项,因为它无法看到是谁请求子组件。通过在模块上声明子组件并将它们的构建器注入到图中,Dagger可以删除整个子组件(如果您根本不调用它们)。
https://stackoverflow.com/questions/73200630
复制相似问题