Hilt 如何在遵循 CLEAN 架构原则的多模块应用程序中有效使用?

Chr*_*rry 7 android dependency-injection solid-principles clean-architecture dagger-hilt

我正在按照 Clean Architecture 原则构建一个 Android 应用程序。这是我所拥有的:

应用模块

  • 包含所有 Android 依赖项。
  • 将 MVVM 与来自 arch 组件的 ViewModel 一起使用。
  • ViewModels 只与 UseCases 通信,它们是构造函数注入的。

用例模块

  • 包含所有用例。
  • 用例仅与存储库通信,存储库是构造函数注入的。

存储库模块

  • 包含所有存储库。
  • 存储库与 Web 服务或数据库等进行通信。
  • 我在这一层定义了一个 Retrofit 接口,存储库在它的构造函数中接受它。

数据模块

  • 包含所有数据模型

我正在尝试在应用程序中使用 Hilt 进行依赖注入。我不想将 Retrofit、OkHttp 等暴露给 app 模块,因为我不希望开发人员能够将网络代码放在错误的模块中。请记住,应用程序模块使用只能与用例对话的 ViewModel。

我该如何设置?我尝试将 dagger 模块放在每个模块中来定义注入,然后在主应用程序模块中我包含了用例中的模块:

@Module(includes = [UseCaseModule::class])
@InstallIn(ApplicationComponent::class)
object AppModule
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它开始抱怨无法在我想隐藏的其他模块中找到传递依赖项。

Fer*_*ano 0

我对多模块采用了相同的方法,但比你的方法更广泛,并且它有效(应用程序、核心、导航、api、数据、域、演示、coreAndroidTest)。

对于AppModule,您不需要指定包含UseCaseModule,只需确保添加 @InstallIn ApplicationComponent :

@Module
@InstallIn(ApplicationComponent::class)
class AppModule {

    @Provides
    fun provideContext(app: Application): Context = app.applicationContext

    @Provides
    fun provideResources(app: Application): Resources = app.resources
}
Run Code Online (Sandbox Code Playgroud)

当您在不同的模块中定义UseCaseModule时,方法相同:

@Module
@InstallIn(ApplicationComponent::class)
class DomainModule {
// Your @Provides
}
Run Code Online (Sandbox Code Playgroud)