非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模块中。

这是一个展示这个想法的项目。


以上是非android模块清洁架构设置中的Hilt的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>