在存储库 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 注释在模块中定义。
请考虑以下内容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 注释在模块中定义。