使用component dependency时如何处理大量Dagger Component?
解决方案
封装下层Component初始化逻辑,避免层泄漏
你可以把每个Component的初始化逻辑封装到其所属模块内部,上层无需感知下层Component的依赖结构。比如给RepositoryComponent添加顶层扩展方法,内部自行处理依赖的ApiComponent和DatabaseComponent的创建:// 放在repository模块内部,不对外暴露下层组件依赖 fun RepositoryComponent.Companion.create(): RepositoryComponent { val apiComponent = ApiComponent.Factory.create() val databaseComponent = DatabaseComponent.Factory.create() return Factory.create(apiComponent, databaseComponent) }上层Application层初始化时只需要调用:
val repositoryComponent = RepositoryComponent.create() val appComponent = AppComponent.Factory.create(repositoryComponent)这样Application层完全感知不到
ApiComponent、DatabaseComponent的存在,也不会出现层代码泄漏的问题。如果你的下层Component是全局单例,还可以在模块内部持有实例,上层直接调用RepositoryComponent.instance获取即可,连初始化调用都省了。用@Subcomponent替换Component依赖减少样板代码
Component依赖本身就是为跨模块独立对象图设计的,但如果你的组件本身就是层级依赖关系,用@Subcomponent会比Component依赖少非常多样板代码。子Component不需要手动声明依赖父Component,也不需要在初始化时传入父Component实例,只需要在父Component的接口中声明返回子Component的方法,Dagger会自动完成实例化。引入Anvil插件自动化组件装配
Square出品的Anvil是专门为Dagger设计的辅助编译插件,可以完全消除手动创建Component、手动传递依赖的样板代码。你只需要给每个下层Component添加注解声明归属的上层Component,Anvil会自动帮你完成所有依赖的组装、Factory的生成,完全不需要手动写任何初始化代码。调整Component拆分粒度,避免过度拆分
正常大型Android应用的Dagger Component数量一般不会超过20个,如果你预估会有上百个Component,说明你的拆分粒度过细。建议改为按功能域拆分Component而非按技术层拆分,每个独立功能域只需要一个Component,依赖关系会大幅简化,样板代码量自然会下降。
内容的提问来源于stack exchange,提问作者tir38

