Hilt 非 android 模块清理架构设置
Hilt in non-android module clean architecture setup
我有一个多模块 android 应用程序设置,它由数据、域和表示模块组成。域模块仅 java。我知道可以通过添加以下方式在非 android 模块中支持刀柄:
域build.gradle
implementation "com.google.dagger:hilt-core:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
域模块提供了 UseCase 类 的实现,它应该被注入到 Presentation (app) 模块中的 ViewModels 中。
域模块:
@Module
@InstallIn(SingletonComponent::class)
// @InstallIn(ViewModelComponent::class)
object UseCaseModule {
@Provides
// @ViewModelScoped
fun provideGetMovieDetailsUseCase(
movieRepository: MovieRepository
): GetMovieDetailsUseCase {
return GetMovieDetailsUseCaseImpl(movieRepository)
}
}
演示模块:
@HiltViewModel
class MovieDetailViewModel @Inject constructor(
private val getMovieDetailsUseCase: GetMovieDetailsUseCase
) : ViewModel() {
...
}
由于 java-only 模块的性质,我无法使用 @InstallIn(ViewModelComponent::class)
注释。相反,我必须在 SingletonComponent::class
中安装依赖项。这也是在 awnser here
中完成的
我的问题
这个方法是'best practice'吗?还是让库成为 Android 库更好,这样我就可以将依赖范围限定在 ViewModel 上?我更愿意将其保留为 java-only 库。
这是我对简洁架构和刀柄的看法
- data 是一个只有 java 的模块,带有数据源接口、存储库接口和模型
- domain 是一个 java-only 模块,带有用例接口和实体
- framework 是一个 android 模块,其中可以找到数据源、存储库和用例的实际实现。这是声明 Hilt 模块的同一模块
- app是domain和framework作为依赖的app模块
我知道的一个常见做法是将所有模块的依赖配置移动到 app
模块(因为 Hilt
的使用是在框架级别)。然后,您可以使用 java 注入库在纯 java 库(例如域层)中注入依赖项。
因此在您的 app
build.gradle
文件中,您将拥有:
// hilt dependency
implementation "com.google.dagger:hilt-android:2.28-alpha"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
在您的 domain
build.gradle
文件中,您将拥有:
implementation "javax.inject:javax.inject:$javaInjectVersion"
总而言之,您“连接”域模块依赖项的文件应移至 app
模块。
Here's a project 证明了这个想法。
我有一个多模块 android 应用程序设置,它由数据、域和表示模块组成。域模块仅 java。我知道可以通过添加以下方式在非 android 模块中支持刀柄:
域build.gradle
implementation "com.google.dagger:hilt-core:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
域模块提供了 UseCase 类 的实现,它应该被注入到 Presentation (app) 模块中的 ViewModels 中。
域模块:
@Module
@InstallIn(SingletonComponent::class)
// @InstallIn(ViewModelComponent::class)
object UseCaseModule {
@Provides
// @ViewModelScoped
fun provideGetMovieDetailsUseCase(
movieRepository: MovieRepository
): GetMovieDetailsUseCase {
return GetMovieDetailsUseCaseImpl(movieRepository)
}
}
演示模块:
@HiltViewModel
class MovieDetailViewModel @Inject constructor(
private val getMovieDetailsUseCase: GetMovieDetailsUseCase
) : ViewModel() {
...
}
由于 java-only 模块的性质,我无法使用 @InstallIn(ViewModelComponent::class)
注释。相反,我必须在 SingletonComponent::class
中安装依赖项。这也是在 awnser here
我的问题
这个方法是'best practice'吗?还是让库成为 Android 库更好,这样我就可以将依赖范围限定在 ViewModel 上?我更愿意将其保留为 java-only 库。
这是我对简洁架构和刀柄的看法
- data 是一个只有 java 的模块,带有数据源接口、存储库接口和模型
- domain 是一个 java-only 模块,带有用例接口和实体
- framework 是一个 android 模块,其中可以找到数据源、存储库和用例的实际实现。这是声明 Hilt 模块的同一模块
- app是domain和framework作为依赖的app模块
我知道的一个常见做法是将所有模块的依赖配置移动到 app
模块(因为 Hilt
的使用是在框架级别)。然后,您可以使用 java 注入库在纯 java 库(例如域层)中注入依赖项。
因此在您的 app
build.gradle
文件中,您将拥有:
// hilt dependency
implementation "com.google.dagger:hilt-android:2.28-alpha"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
在您的 domain
build.gradle
文件中,您将拥有:
implementation "javax.inject:javax.inject:$javaInjectVersion"
总而言之,您“连接”域模块依赖项的文件应移至 app
模块。
Here's a project 证明了这个想法。