You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分层多模块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层的具体实现类**。

为什么可行?

  1. 从Clean Architecture原则来看,依然遵循“依赖抽象而非具体”的核心规则::presentation代码只调用:domain层定义的UseCase和Repository接口,完全不知道:data层的实现细节。
  2. 从Hilt的工作机制来看,添加该依赖是为了让Hilt在构建应用全局组件时,能够扫描到:data模块中的Hilt模块,从而为:domain层的UseCase提供RestaurantRepository的实现实例。

具体步骤

  1. 调整模块依赖:在:presentation模块的build.gradle中添加对:data的依赖:
    dependencies {
        // 原有依赖
        implementation project(':commons')
        implementation project(':domain')
        // 添加这一行
        implementation project(':data')
    }
    
  2. 确保Hilt配置正确:
    • 应用入口的Application类(位于:presentation模块)添加@HiltAndroidApp注解:
      @HiltAndroidApp
      class MyApp : Application()
      
    • 所有模块都配置Hilt插件与依赖:
      根build.gradle示例:
      plugins {
          id 'com.google.dagger.hilt.android' version '2.48' apply false
      }
      
      各模块build.gradle示例:
      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
      }
      
  3. 验证代码规范:检查:presentation层代码,确保没有直接导入:data层的任何类(比如RestaurantRepositoryImpl、RestaurantApi等),所有操作都通过:domain层的抽象完成。

补充说明

如果觉得:presentation直接依赖:data不够优雅,也可以考虑创建一个独立的di模块:

  • di模块依赖:domain和:data,专门存放所有Hilt配置类
  • :presentation模块依赖di模块而非:data模块

这种方式会让模块依赖关系更清晰,但本质上和上述方案的核心逻辑一致——都是让Hilt能够扫描到:data层的实现模块,同时保证业务层不依赖具体实现。

内容的提问来源于stack exchange,提问作者NS.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:25:29