我应该为来自依赖注入的函数参数添加 @Inject 吗?
Should I add @Inject for the function parameter which is from dependency injection?
我正在学习依赖注入,以下代码A来自项目https://github.com/android/sunflower
1:函数providePlantDao的参数appDatabase来自依赖注入,为什么作者不像代码B那样在appDatabase前面加上@Inject?
2:代码C对吗?
代码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
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(@Inject appDatabase: AppDatabase): PlantDao {
return appDatabase.plantDao()
}
...
}
代码C
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(): PlantDao {
@Inject lateinit var appDatabase: AppDatabase
return appDatabase.plantDao()
}
...
}
只有在想要通过字段注入提供依赖时才需要@Inject
。不仅在函数内部是不可能的,而且你必须阅读以下代码:
@InstallIn(SingletonComponent::class) @Module class DatabaseModule
有了这个,你告诉 hilt 你想要创建一个应该安装在 SingleletonComponent
Graph 中的新模块。因此,此模块中提供的每个依赖项都可用于整个应用程序。
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase
现在你告诉 hilt,你想提供一个用 @Singleton
注释的依赖项,因此它应该创建一次/始终提供相同的实例。此外,你告诉 hilt,如何创建 AppDatabase
的实例,所以此时 dagger hilt 知道:“哈,现在我知道如何创建 AppDatabase,每次程序员需要 AppDatabase 时,我都会提供同一个实例!"
@Provides
fun providePlantDao(appDatabase: AppDatabase): PlantDao
现在您告诉 hilt 如何提供 PlantDao
的实例。您不需要手动注入 AppDatabase
也不需要编写 @Inject
因为您已经告诉 hilt 如何创建 AppDatabase!
我正在学习依赖注入,以下代码A来自项目https://github.com/android/sunflower
1:函数providePlantDao的参数appDatabase来自依赖注入,为什么作者不像代码B那样在appDatabase前面加上@Inject?
2:代码C对吗?
代码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
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(@Inject appDatabase: AppDatabase): PlantDao {
return appDatabase.plantDao()
}
...
}
代码C
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(): PlantDao {
@Inject lateinit var appDatabase: AppDatabase
return appDatabase.plantDao()
}
...
}
只有在想要通过字段注入提供依赖时才需要@Inject
。不仅在函数内部是不可能的,而且你必须阅读以下代码:
@InstallIn(SingletonComponent::class) @Module class DatabaseModule
有了这个,你告诉 hilt 你想要创建一个应该安装在 SingleletonComponent
Graph 中的新模块。因此,此模块中提供的每个依赖项都可用于整个应用程序。
@Singleton @Provides fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase
现在你告诉 hilt,你想提供一个用 @Singleton
注释的依赖项,因此它应该创建一次/始终提供相同的实例。此外,你告诉 hilt,如何创建 AppDatabase
的实例,所以此时 dagger hilt 知道:“哈,现在我知道如何创建 AppDatabase,每次程序员需要 AppDatabase 时,我都会提供同一个实例!"
@Provides fun providePlantDao(appDatabase: AppDatabase): PlantDao
现在您告诉 hilt 如何提供 PlantDao
的实例。您不需要手动注入 AppDatabase
也不需要编写 @Inject
因为您已经告诉 hilt 如何创建 AppDatabase!