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 项目中
未解决的参考匕首 2 + kotlin + android gradle