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)
现在您可以在任何构造函数中传递此接口。
| 归档时间: |
|
| 查看次数: |
5675 次 |
| 最近记录: |