【发布时间】:2021-11-18 17:03:12
【问题描述】:
我有一个 Dagger 对象图,它是通过使用组件依赖关系从许多较小的对象图构建的。每个组件本质上都是它自己的对象图,它向上暴露一些对象以满足树上其他组件的依赖关系。 在每个组件中的对象图是无关紧要的(所以我根本不是在谈论 Dagger @Modules。)
@Component(dependencies = [RepositoryComponent::class])
interface AppComponent {
(其他组件的类似设置)
使用 vanilla Dagger,我可以通过调用各自的构建器来创建每个组件。
val appComponent = DaggerAppComponent
.builder()
.build()
(通常在Application类中。)
但我还需要通过创建 Factory 并添加到其 create 方法来提供组件依赖项
@Component(dependencies = [RepositoryComponent::class])
interface AppComponent {
@Component.Factory
interface Factory {
fun create(repositoryComponent: RepositoryComponent): AppComponent
}
}
然后调用工厂的create 方法而不是构建器
val appcComponent = DaggerAppComponent
.factory()
.create(repositoryComponent = ...)
所有这些都是标准组件依赖,或多或少直接来自the Dagger docs
当你意识到你必须为RepositoryComponent、ApiComponent 和DatabaseComponent 重现整个事情时,事情就会变得艰难。最后的“组件创建”开始膨胀:
val apiComponent = ApiComponent.Factory
.create()
val databaseComponent = DatabaseComponent.Factory
.create()
val repositoryComponent = RepositoryComponent.Factory
.create(
apiComponent,
databaseComponent
)
val appComponent = AppComponent.Factory
.create(repositoryComponent)
}
您可以想象,一旦我的应用包含 100 个 Dagger 组件,这将无法扩展。我的应用程序知道整个组件树。我将api 代码泄漏到app 层。有没有办法减少这个样板?其他团队如何使用更大的应用处理这个问题?
【问题讨论】: