如何在 Room MVVM 架构中实现 Koin 依赖注入

Yaq*_*tti 2 android dependency-injection koin

我正在按照文档来实现 koin 依赖注入,但它对我没有帮助。我陷入了Modules.kt文件困境,我不知道如何将数据库的 DAO 接口传递给koin 的Repository构造函数module

用户实体.kt

@Entity(tableName = "user_table")
data class UserEntity(...)
Run Code Online (Sandbox Code Playgroud)

UserDao.kt

@Dao
interface UserDao { ... }
Run Code Online (Sandbox Code Playgroud)

用户存储库.kt

class UserRepository(private val userDao: UserDao) {...}
Run Code Online (Sandbox Code Playgroud)

用户视图模型.kt

class UserViewModel(private val repository: UserRepository) : ViewModel() {...}
Run Code Online (Sandbox Code Playgroud)

用户数据库.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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Modules.kt这是 Koin 模块

val appModule = module{

    single { UserRepository(get()) }

    viewModel { UserViewModel(get()) }

}
Run Code Online (Sandbox Code Playgroud)

Vai*_*yal 17

首先在您从房间数据库类扩展的类文件中。您将需要创建一个抽象函数来提供 Dao 接口的实例,如下所示,

@Database(entities = [Run::class],version = 1 , exportSchema = false)
abstract class RunningDatabase : RoomDatabase() {

abstract fun getRunDao(): RunDao
}
Run Code Online (Sandbox Code Playgroud)

然后在您的模块中提供房间数据库的实例,如下所示,

single {
   Room.databaseBuilder(
     androidApplication,
     RunningDatabase::class.java,
     RUNNING_DATABASE_NAME
 ).build()
}
Run Code Online (Sandbox Code Playgroud)

现在可以调用Room Database类的抽象函数来获取Dao接口的实例。像这样,

single<RunningDao> {
  val database = get<RunningDatabase>()
  database.getRunDao()
}
Run Code Online (Sandbox Code Playgroud)

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