如何在 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()
}

现在您可以在任何构造函数中传递此接口。