【发布时间】:2021-09-08 11:18:18
【问题描述】:
我正在学习依赖注入,以下代码A和代码B来自项目https://github.com/android/sunflower
作者在代码A中定义了一个依赖注入PlantDao,但是在代码B中手动使用代码database.plantDao()创建了一个PlantDao对象。
为什么作者不对代码B中的对象PlantDao使用依赖注入?如何在代码 B 中对对象 PlantDao 使用依赖注入?
代码 A
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(appDatabase: AppDatabase): PlantDao {
return appDatabase.plantDao()
}
...
}
代码 B
class SeedDatabaseWorker(
context: Context,
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
try {
val filename = inputData.getString(KEY_FILENAME)
if (filename != null) {
applicationContext.assets.open(filename).use { inputStream ->
JsonReader(inputStream.reader()).use { jsonReader ->
...
val database = AppDatabase.getInstance(applicationContext)
database.plantDao().insertAll(plantList)
...
} else {
...
}
} catch (ex: Exception) {
...
}
}
..
}
添加内容
致安德鲁:谢谢!
在这个question中,你告诉我@InstallIn(SingletonComponent::class)将可用于整个应用程序,你可以看图1。
作者在代码A中定义了PlantDao的依赖注入对象,安装为SingletonComponent::class。
所以我认为PlantDao的对象对整个应用程序都是可用的,为什么我不能在代码B中直接使用PlantDao的依赖注入对象?
代码 D
class SeedDatabaseWorker @Inject constructor(
database: AppDatabase,
context: Context,
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
try {
val filename = inputData.getString(KEY_FILENAME)
if (filename != null) {
applicationContext.assets.open(filename).use { inputStream ->
JsonReader(inputStream.reader()).use { jsonReader ->
...
database.plantDao().insertAll(plantList)
...
} else {
..
}
【问题讨论】:
标签: kotlin dependency-injection dagger-hilt