Dagger 在单独的 gradle 模块中

Posted

技术标签:

【中文标题】Dagger 在单独的 gradle 模块中【英文标题】:Dagger in separate gradle module 【发布时间】:2016-11-30 13:01:48 【问题描述】:

我的“干净架构”android 应用程序中有 3 个 gradle 模块:“数据”、“域”和“演示”。 'data' 和 'presentation' 都依赖于 'domain',但不相互依赖。 'presentation' 保存 Application 类的实现,而 'data' 保存一些存储库单例的实现。

我想使用 Dagger 2 在应用程序中实例化存储库,但在这种情况下,我需要在“数据”和“演示”之间建立间接的 gradle 依赖关系。从 Clean 架构的角度来看,这种依赖关系看起来很丑陋,这使得从“表示”访问“数据”成为可能。 将 Dagger 组件和模块代码放在单独的 gradle 模块 'di' 中会创建循环 gradle 依赖项 'data' -> 'di' -> 'data'。

有没有合适的方法将所有 DI 代码移动到单独的模块中?

【问题讨论】:

你找到解决办法了吗?这是一个有趣的想法,但我不知道在这种情况下如何避免循环依赖。 【参考方案1】:

我认为将依赖关系放在“演示文稿”和“基础设施”(在您的情况下为“数据”)之间并不是一个坏习惯。

您可以将所有技术依赖项放在基础设施层并从应用程序层调用它(在您的情况下为“表示”)。

这是因为,在某些情况下,如果您没有业务规则,您需要调用基础架构而不调用域层。

干净架构中最重要的事情是将域与所有其他事物(尤其是技术事物)分开。

您还可以在同一个模块中拥有应用程序和基础设施层。

有了这些依赖,你就没有循环依赖了:

application -> domain 
application -> infrastructure
infrastructure -> domain

如果你有以下依赖,你可以拥有它:

domain -> infrastructure

也就是说,您不应该在应用层实例化 Dagger 类。所有的数据访问实例都必须在基础设施层。 您可以从应用程序调用数据访问接口,并在基础设施层使用 Dagger 实现。

【讨论】:

以上是关于Dagger 在单独的 gradle 模块中的主要内容,如果未能解决你的问题,请参考以下文章

错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中

很长的 gradle 构建时间 - Android

未解决的参考匕首 2 + kotlin + android gradle

Gradle for Android 第五篇( 多模块构建 )

Dagger 2,在模块中提供应用程序上下文

Android-Gradle