如何构建 Hilt 模块以向我的存储库提供 Api 和 Room?

问题描述 投票:0回答:1

我有一个应用程序,目前仅在启动时进行一些 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
}
kotlin android-room repository-pattern dagger-hilt clean-architecture
1个回答
0
投票

当您只有一种实现匕首或剑柄时,不要使用 @Named("mkRetrofit");当您有多个构建器类和接口实现时,请不要使用 @Named("mkRetrofit")...

第二件事 { fun ProvideBaseUrl() = "https://..."} 不要将 URL 放入模块中,而是将 URL 放入对象中,因为在 kotlin 中我们有对象或伴生对象来存储常量...

你的模块的范围已经是单例的,所以不要将它们创建为对象使用类

房间模块 不要在模块中进行存储库实现 也不要从这里调用 dao 使用 repo 来调用 dao 并从 api 获取数据

希望兄弟能理解你的错误!

© www.soinside.com 2019 - 2024. All rights reserved.