如何在 Room MVVM 架构中实现 Koin 依赖注入
How to implement Koin dependency injection in Room MVVM Architecture
我正在按照 this 文档来实施 koin 依赖注入,但它无法帮助我。我被困在 Modules.kt
文件中 我不知道如何将数据库的 DAO 接口传递给 koin module
中的 Repository
构造函数。
UserEntity.kt
@Entity(tableName = "user_table")
data class UserEntity(...)
UserDao.kt
@Dao
interface UserDao { ... }
UserRepository.kt
class UserRepository(private val userDao: UserDao) {...}
UserViewModel.kt
class UserViewModel(private val repository: UserRepository) : ViewModel() {...}
UserDatabase.kt
@Database(
entities = [UserEntity::class],
version = 1,
exportSchema = false
)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context, scope: CoroutineScope): UserDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_data_database"
).build()
INSTANCE = instance
instance
}
}
}
}
Modules.kt 这是 Koin 模块
val appModule = module{
single { UserRepository(get()) }
viewModel { UserViewModel(get()) }
}
首先在您的 class 文件中,该文件是您从房间数据库 class 扩展而来的。您将需要创建一个抽象函数来提供 Dao 接口的实例,
@Database(entities = [Run::class],version = 1 , exportSchema = false)
abstract class RunningDatabase : RoomDatabase() {
abstract fun getRunDao(): RunDao
}
然后在您的模块中像这样提供房间数据库实例,
single {
Room.databaseBuilder(
androidApplication,
RunningDatabase::class.java,
RUNNING_DATABASE_NAME
).build()
}
现在可以调用Room Database的抽象函数class获取Dao接口的Instance。像这样,
single<RunningDao> {
val database = get<RunningDatabase>()
database.getRunDao()
}
现在您可以在任何构造函数中传递此接口。
我正在按照 this 文档来实施 koin 依赖注入,但它无法帮助我。我被困在 Modules.kt
文件中 我不知道如何将数据库的 DAO 接口传递给 koin module
中的 Repository
构造函数。
UserEntity.kt
@Entity(tableName = "user_table")
data class UserEntity(...)
UserDao.kt
@Dao
interface UserDao { ... }
UserRepository.kt
class UserRepository(private val userDao: UserDao) {...}
UserViewModel.kt
class UserViewModel(private val repository: UserRepository) : ViewModel() {...}
UserDatabase.kt
@Database(
entities = [UserEntity::class],
version = 1,
exportSchema = false
)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context, scope: CoroutineScope): UserDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_data_database"
).build()
INSTANCE = instance
instance
}
}
}
}
Modules.kt 这是 Koin 模块
val appModule = module{
single { UserRepository(get()) }
viewModel { UserViewModel(get()) }
}
首先在您的 class 文件中,该文件是您从房间数据库 class 扩展而来的。您将需要创建一个抽象函数来提供 Dao 接口的实例,
@Database(entities = [Run::class],version = 1 , exportSchema = false)
abstract class RunningDatabase : RoomDatabase() {
abstract fun getRunDao(): RunDao
}
然后在您的模块中像这样提供房间数据库实例,
single {
Room.databaseBuilder(
androidApplication,
RunningDatabase::class.java,
RUNNING_DATABASE_NAME
).build()
}
现在可以调用Room Database的抽象函数class获取Dao接口的Instance。像这样,
single<RunningDao> {
val database = get<RunningDatabase>()
database.getRunDao()
}
现在您可以在任何构造函数中传递此接口。