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

Dependency injection 为什么Dagger子组件在模块中声明,而不是直接在父组件中声明?,dependency-injection,dagger-2,dagger,Dependency Injection,Dagger 2,Dagger,为什么subcomponents=属性设置在组件的模块上,而不是直接设置在组件上?这对我来说不是很直观,所以我想一定有原因 @Component(modules = ExampleModule.class) public interface AppComponent @Module(subcomponents = ActivityComponent.class) public abstract class ExampleModule 从某种意义上说,子组件位于模块上更有意义:它们是私有的实

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

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

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

从某种意义上说,子组件位于模块上更有意义:它们是私有的实现细节,不一定公开,公开的仍然可以作为构建器方法直接列在组件上。为了便于比较,您也不能直接在组件上定义
@提供
@绑定
方法;这些还影响组件的实现细节,不一定公开

然而,你的观点是正确的;截至2019年4月29日,这是(#1463),由谷歌贡献者David P.Baker提交

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

[……]

建议在
dagger.Component
dagger.Subcomponent
dagger.producers.ProductionComponent
dagger.producers.ProductionSubcomponent
中添加
子组件

这将在概念上简化这些案例,并减少样板文件,因为不需要空模块


谢谢你的澄清。创建空模块只是为了声明子组件是常见的吗?或者您通常会使用现有模块。@FlorianWalther完全由您选择,您也可以使用它。我不经常在其他空模块上看到它,但这通常是因为我看到每个
@Component
都有自己相邻的
@Module
用于实用程序绑定,因此已经创建了一个方便的文件。我会毫不犹豫地把它放在一个空模块上,如果那里没有其他东西的话。