Dagger 2 - 组件依赖于两个组件

Dagger 2 - Component depends on two components

问题:如何使用 Dagger 2 基于 BeansComponentWaterComponent 中的依赖项构建 CoffeeComponent?

ApplicationComponent <- @modules = Earth.module | | BeansComponent WaterComponent \ / CoffeeComponent

要求: BeansComponentWaterComponent 有各自的作用域。

目前的解决方案:

BeansComponent 将是 ApplicationComponent

的子组件

WaterComponent 将是 ApplicationComponent

的子组件

ApplicationComponent 使用 EarthModule

WaterComponentBeansComponent 使用来自 ApplicationComponent (EarthModule)

的依赖项

可以将 BeansComponentWaterComponent 的所有模块一起包含在 WaterBeansComponent 中,并创建 CoffeeComponent 作为 WaterBeansComponent 的子组件。但是不同的范围是不可能的。

Dagger 2 不支持以图中概述的方式混合作用域。请参阅 this question 尝试解释原因。

此外,如果您正确构建应用程序,则不需要范围多重继承。范围和组件跟踪 生命周期 因此子组件跟踪两个兄弟生命周期没有多大意义。

使用模块可能更好地实现您正在寻找的关注点分离。首先使用模块按功能分组。然后推理将绑定在模块中的依赖项的生命周期,并使用这些知识从您的模块中组合组件。