为什么Dagger子组件在模块中而不是在父组件中直接声明?

时间:2019-04-29 18:20:15

标签: dependency-injection dagger-2 dagger

为什么在组件的模块上而不是直接在组件上设置subcomponents =属性?对我来说这似乎不是很直观,所以我想一定是有原因的。

@Component(modules = ExampleModule.class)
public interface AppComponent 

@Module(subcomponents = ActivityComponent.class)
public abstract class ExampleModule

1 个答案:

答案 0 :(得分:1)

从某种意义上说,将子组件包含在模块中更有意义:它们是私有的实现细节,不必公开公开,而那些公开的子组件仍可以作为构建器方法列出。直接在组件上。为了进行比较,您也不能直接在组件上定义@Provides@Binds方法。这些也会影响该组件的实现细节,并且不一定是公开可见的。

但是,你的观点是正确的;截至2019年4月29日,这是an open and triaged issue(#1463),由Google贡献者David P. Baker提交。

  

我们看到一种模式,人们创建空模块只是为了向组件添加子组件:

     

[...]

     

建议将subcomponents添加到dagger.Componentdagger.Subcomponentdagger.producers.ProductionComponentdagger.producers.ProductionSubcomponent中。

     

这将在概念上简化这些情况并减少样板,因为不需要空模块。