在存储库 class 中使用匕首柄

Using dagger-hilt in repository class

请考虑以下内容class:

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

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

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

或者需要更多??

是的,够了。但是如果你想让你的测试更轻松,可以考虑在 MainRepository 中添加一个 Interface,如下所示:

interface MainRepository {
   // your functions
}

然后是实施

@Singleton
class MainRepositoryImpl @Inject constructor(
     // your dependencies
) : MainRepository

最后,在你的 Di.Modules

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

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

class ExampleRepositoryUsageClass @Inject constructor(
     private val mainrepository: MainRepository // MainRepositoryImpl is injected here
)

为了将依赖项注入到存储库实现中,可以使用注解@Inject 将依赖项注入到构造函数中。要使 @Inject 起作用,还需要另外两件事。使用 @Binds 注释在存储库模块中绑定存储库的依赖项,并使用注释 @Provides[=29] 提供传递给存储库构造函数的依赖项=].

@Inject 依赖项到存储库的构造函数中:

class MainRepository @Inject constructor(
    private val blogDao: BlogDao,
    private val blogRetrofit: BlogRetrofit,
    private val cacheMapper: CacheMapper,
    private val networkMapper: NetworkMapper
) { ... }

@Binds 存储库模块中存储库的依赖项,MyRepositoryModule.kt,你想在 ViewModelComponent 中安装模块,因为存储库通常应该在视图模型中.

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent

@Module
@InstallIn(ViewModelComponent::class)
interface MyRepositoryModules {
    @Binds
    fun provideMainRepository(repository: MainRepository): MainRepository
}

@Provides 传递给模块中存储库构造函数的依赖项,MyModules.kt

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers

@InstallIn(ViewModelComponent::class)
@Module
object MyModule {
    @Provides
    fun provideBlogDao(): BlogDao {
        // code for creating BlogDao
        return BlogDao()
    }

    @Provides
    fun provideBlogRetrofit(): BlogRetrofit {
        // code for creating BlogRetrofit
        return BlogRetrofit()
    }
    @Provides
    fun provideCacheMapper(): CacheMapper {
        // code for creating CacheMapper
        return CacheMapper()
    }
    @Provides
    fun provideNetworkMapper(): NetworkMapper {
        // code for creating NetworkMapper
        return NetworkMapper()
    }
}

对于用于注入存储库或任何地方的任何依赖项,它们必须存在,这意味着它们需要在注入之前使用 @Provides 注释在模块中定义。