分层多模块Android应用中Hilt DI配置最优方案咨询
解决Clean Architecture模块化Android应用中Hilt跨模块注入问题
问题背景
我正在开发一个遵循Clean Architecture的模块化Android应用,划分为:presentation、:domain、:data、commons四个模块,依赖层级如下:
- :presentation 可访问 :commons + :domain
- :domain 可访问 :commons
- :data 可访问 :commons + :domain
- :commons 不依赖任何其他模块
核心问题:将提供RestaurantRepository接口实现的Hilt模块放在:data模块中(符合数据层职责),但:domain层的GetRestaurants UseCase需要注入该接口实例时,无法获取到依赖。
最佳解决方案
方案核心
在:presentation模块中添加对:data模块的implementation依赖,但严格保证**:presentation层代码仅依赖:domain层的抽象(接口、UseCase等),绝不直接引用:data层的具体实现类**。
为什么可行?
- 从Clean Architecture原则来看,依然遵循“依赖抽象而非具体”的核心规则:
:presentation代码只调用:domain层定义的UseCase和Repository接口,完全不知道:data层的实现细节。 - 从Hilt的工作机制来看,添加该依赖是为了让Hilt在构建应用全局组件时,能够扫描到
:data模块中的Hilt模块,从而为:domain层的UseCase提供RestaurantRepository的实现实例。
具体步骤
- 调整模块依赖:在
:presentation模块的build.gradle中添加对:data的依赖:dependencies { // 原有依赖 implementation project(':commons') implementation project(':domain') // 添加这一行 implementation project(':data') } - 确保Hilt配置正确:
- 应用入口的
Application类(位于:presentation模块)添加@HiltAndroidApp注解:@HiltAndroidApp class MyApp : Application() - 所有模块都配置Hilt插件与依赖:
根build.gradle示例:
各模块build.gradle示例:plugins { id 'com.google.dagger.hilt.android' version '2.48' apply false }plugins { id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } dependencies { implementation "com.google.dagger:hilt-android:2.48" kapt "com.google.dagger:hilt-compiler:2.48" } kapt { correctErrorTypes true }
- 应用入口的
- 验证代码规范:检查
:presentation层代码,确保没有直接导入:data层的任何类(比如RestaurantRepositoryImpl、RestaurantApi等),所有操作都通过:domain层的抽象完成。
补充说明
如果觉得:presentation直接依赖:data不够优雅,也可以考虑创建一个独立的di模块:
di模块依赖:domain和:data,专门存放所有Hilt配置类:presentation模块依赖di模块而非:data模块
这种方式会让模块依赖关系更清晰,但本质上和上述方案的核心逻辑一致——都是让Hilt能够扫描到:data层的实现模块,同时保证业务层不依赖具体实现。
内容的提问来源于stack exchange,提问作者NS.
相关产品推荐
相关产品推荐

