在存储库类中使用 dagger-hilt

sok*_*sok 0 android dependency-injection kotlin dagger-hilt

请考虑以下类:

class MainRepository constructor(
    private val blogDao: BlogDao,
    private val blogRetrofit: BlogRetrofit,
    private val cacheMapper: CacheMapper,
    private val networkMapper: NetworkMapper
){
    .....
}
Run Code Online (Sandbox Code Playgroud)

如果我想将 MainRepository 类转换为使用 dagger-hilt 来传递参数,那么在构造函数之前添加 @Inject 就足够了吗?

class MainRepository @Inject constructor(
    private val blogDao: BlogDao,
    private val blogRetrofit: BlogRetrofit,
    private val cacheMapper: CacheMapper,
    private val networkMapper: NetworkMapper
){
Run Code Online (Sandbox Code Playgroud)

还是需要更多??

And*_*rew 5

是的,这就够了。但是,如果你想使你的生活更简单的测试,可以考虑加入InterfaceMainRepository这样的:

interface MainRepository {
   // your functions
}
Run Code Online (Sandbox Code Playgroud)

然后是实施

@Singleton
class MainRepositoryImpl @Inject constructor(
     // your dependencies
) : MainRepository
Run Code Online (Sandbox Code Playgroud)

最后,在你的 Di.Modules 中

@Module
@InstallIn(ApplicationComponent::class) // or whatever graph fits your need the best
interface RepositoryModules {
    @Binds
    fun provideMainRepositoryImpl(repository: MainRepositoryImpl): MainRepository
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像下面这样使用你的存储库

class ExampleRepositoryUsageClass @Inject constructor(
     private val mainrepository: MainRepository // MainRepositoryImpl is injected here
)
Run Code Online (Sandbox Code Playgroud)