android - Dagger 在单独的 gradle 模块中

标签 android gradle circular-dependency dagger-2 clean-architecture

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

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

是否有适当的方法将所有 DI 代码移动到单独的模块中?

最佳答案

我认为在“演示文稿”和“基础设施”(在您的情况下为“数据”)之间建立依赖关系并不是一个坏习惯。
您可以将所有技术依赖项放在基础设施层并从应用程序层调用它(在您的情况下为“演示”)。
这是因为,在某些情况下,您需要调用基础设施而不调用域层:如果您没有业务规则。
干净架构中最重要的事情是将域与所有其他事物(尤其是技术事物)分开。
您还可以在同一个模块中拥有应用程序层和基础设施层。
有了这些依赖,你就没有循环依赖:

application -> domain 
application -> infrastructure
infrastructure -> domain
如果你有以下依赖,你可以拥有它:
domain -> infrastructure
也就是说,你不应该在应用层实例化 Dagger 类。所有的数据访问实例都必须在基础设施层。
您可以从应用程序调用数据访问接口(interface),并在基础设施层使用 Dagger 实现它。

关于android - Dagger 在单独的 gradle 模块中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38597353/

相关文章:

autofac - 如何在Autofac中注册循环类型?

c++ - 具有继承模板类的循环依赖

java - 套接字 - 地址已在使用中

spring - 找不到参数的方法 springBoot() - 使用 Kotlin 的 Spring Boot

java - 通过Android连接MySQL错误

添加 Facebook sdk 和 Google Firebase sdk 时的 Android Proguard 问题(重复)

android - 无法使用 Android Studio 构建 Gradle 项目

c++ - 如何实现具有另一个派生类的协变返回类型的函数?

跨多个 Activity 的标题栏中的 Android 加载图标

java - 删除 MPAndroidChart 中的 BarDataSet