我有一个应用程序,目前仅在启动时进行一些 API 调用并在屏幕上显示结果,因此我的 ViewModel 直接与 Api 通信(我知道这是不对的)。但是,我计划将这些结果缓存在 Room 数据库中。因此,我需要创建一个存储库来处理从 API 获取数据,将它们存储在 Room 上,然后将数据呈现给 ViewModel
我的 Api 注入由 Hilt 处理,由于我是依赖注入的新手,因此我需要一些帮助来构建我的 Hilt 模块。目前我有一个模块用于提供 Api,另一个模块用于提供 Room。
所以我的问题是,构建模块的最佳方式是什么,以便 Hilt 向我的存储库提供 Api 和 Room 服务,并向 ViewModel 提供存储库 我是否需要将 Api、Room 和 repo 提供程序放入一个模块中,还是我每堂课都做一个?
我当前的实现如下(省略构建器代码,因为我认为这对这个问题不重要......):
API模块:
@Module
@InstallIn(SingletonComponent::class)
object MKApiService {
@Provides
@Named("mkBaseUrl")
fun provideBaseUrl() = "https://..."
@Provides
@Singleton
@Named("mkRetrofit")
fun provideMkRetrofit(@Named("mkBaseUrl") baseUrl: String): Retrofit {
...
}
@Provides
@Singleton
@Named("mkApiService")
fun provideApiService(@Named("mkRetrofit") retrofit: Retrofit): IMKApiService =
retrofit.create(IMKApiService::class.java)
}
房间模块:
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase =
Room.databaseBuilder(
appContext,
AppDatabase::class.java,
"room_database"
).build()
@Provides
@Singleton
fun provideAgendamentosDao(database: AppDatabase): AgendamentosDao =
database.agendamentosDao()
@Provides
@Singleton
fun provideAgendamentosRepository(dao: AgendamentosDao): AgendamentosRepository =
AgendamentosRepository(dao)
// this gives an error since my repository asks for the dao and the api service
}
当您只有一种实现匕首或剑柄时,不要使用 @Named("mkRetrofit");当您有多个构建器类和接口实现时,请不要使用 @Named("mkRetrofit")...
第二件事 { fun ProvideBaseUrl() = "https://..."} 不要将 URL 放入模块中,而是将 URL 放入对象中,因为在 kotlin 中我们有对象或伴生对象来存储常量...
你的模块的范围已经是单例的,所以不要将它们创建为对象使用类
房间模块 不要在模块中进行存储库实现 也不要从这里调用 dao 使用 repo 来调用 dao 并从 api 获取数据
希望兄弟能理解你的错误!