【问题标题】:How to implement Koin dependency injection in Room MVVM Architecture如何在 Room MVVM 架构中实现 Koin 依赖注入
【发布时间】:2021-12-18 10:03:16
【问题描述】:

我正在关注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()) }

}

【问题讨论】:

  • 您需要提供的不仅仅是“它对我没有帮助”——究竟什么对您不起作用?你在哪里卡住了? “这是我所有的代码,告诉我怎么做”不是问题。
  • 好的,我正在更新我的问题
  • 我更新了问题,但我被困在 Modules.kt 课程中。我不知道如何在 UserRepository 中传递接口
  • “它出错了” - 你得到了什么错误?
  • @RyanM 当我将private val userViewModel: UserViewModel by viewModels { UserViewModel.UserViewModelFactory((application as MainApplication).repository) } 替换为private val userViewModel: UserViewModel by viewModels() 时,UserActivity.kt 出现错误

标签: android dependency-injection koin


【解决方案1】:

首先在您从 Room Database 类扩展的类文件中。您将需要创建一个抽象函数来提供像这样的 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 类的抽象函数来获取 Dao 接口的实例。像这样,

single<RunningDao> {
  val database = get<RunningDatabase>()
  database.getRunDao()
}

现在你可以在任何构造函数中传递这个接口了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多