非android模块清洁架构设置中的Hilt
我有一个多模块化 android 应用程序设置,它由一个数据、域和演示模块组成。域模块是纯 Java 的。我知道可以通过添加以下内容来支持非 android 模块中的刀柄:
领域 build.gradle
implementation "com.google.dagger:hilt-core:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
域模块提供了 UseCase 类的实现,这些类应该注入到位于 Presentation (app) 模块中的 ViewModel 中。
域模块:
@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 中完成的
我的问题
这种方法是“最佳实践”吗?还是将库设为 Android 库更好,以便我可以将依赖范围限定为 ViewModel?我更愿意将它保留为仅限 Java 的库。
回答
我知道的一个常见做法是将所有模块的依赖配置移动到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模块中。
这是一个展示这个想法的项目。