android-studio - 如何在分离本地和远程数据源的同时保留当前的后端架构?
问题描述
长话短说,试图利用谷歌的良好做法。我犯了一个错误,为项目 Di 选择了匕首 2。现在我被困住了。我遵循向日葵架构 ,我试图将本地数据(ld)源和远程数据(rd)源分开,同时尽可能保留我拥有的架构。我目前有 2 个数据源 ld 和 rd 实现数据源接口。而且我的存储库仅识别来自该接口的功能。在谷歌示例中,它们在两个数据源中共享相同的功能,而我的项目与此不同,它们应该具有不同的功能。(Ld 应该在数据库中插入引号,而远程应该只获取引号)
我已经尝试创建一个实现数据源但特定于本地数据源的新接口,但没有成功,不断从 dagger 收到缺少绑定错误。
interface QuoteDataSource { //data source interface for both data sources
suspend fun getQuotes(): Result<List<Quote>>
}
class DefaultQuoteRepository @Inject constructor(
@ApplicationModule.QuoteRemoteDataSource private val quoteRemoteDataSource: QuoteDataSource,
@ApplicationModule.QuoteLocalDataSource private val quoteLocalDataSource: QuoteDataSource,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : BaseRepository(), QuoteRepository {
@JvmStatic
@Singleton
@QuoteRemoteDataSource
@Provides
fun provideQuoteRemoteDataSource(
jsonNetworkService: JsonNetworkService
): QuoteDataSource {
return QuoteRemoteDataSource(jsonNetworkService.apiService)
}
@JvmStatic
@Singleton
@QuoteLocalDataSource
@Provides
fun provideQuoteLocalDataSource(
database: LocalQuoteDataBase,
ioDispatcher: CoroutineDispatcher
): QuoteDataSource {
return QuoteLocalDataSource(
database.quotesDao(), ioDispatcher
)
}
class QuoteLocalDataSource constructor( // for fetching locally stored quotes, might save favorite quootes or save the json quotes
private val quotesDao: QuotesDao,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : QuoteDataSource {
override suspend fun getQuotes(): Result<List<Quote>> = withContext(ioDispatcher) {
return@withContext try {
Success(quotesDao.getQuotes())
} catch (e: Exception) {
Result.Error(IOException("Unable to fetch quotes!"))
}
}
class QuoteRemoteDataSource @Inject constructor(
private val apiService: QuoteApi
) : QuoteDataSource {
override suspend fun getQuotes(): Result<List<Quote>> {
val response = apiService.getQuotes().await()
try {
if (response.isSuccessful)
if(!response.body().isNullOrEmpty())
return Result.Success(response.body()) as Result<List<Quote>>
return Result.Error(IOException("Error occurred during fetching quotes!"))
} catch (e: Exception) {
Result.Error(IOException("Unable to fetch quotes!"))
}
return Result.Error(IOException("Unable to fetch quotes!"))
}
我试图让本地数据源拥有自己的功能,这些功能可以被默认报价存储库识别。就好像我只是将函数添加到 localds 一样,它们对存储库不可用。
解决方案
推荐阅读
- javascript - javascript 仅显示带有 promise 对象的 for 循环的最后一次迭代的输出
- python - 当检测到按键被按下时如何让Python执行命令
- c# - Additional text encountered after JSON reading
- javascript - 如何防止我的空字符串成为长度的一部分
- angular - Reset an input field to pristine without form wrapper
- java - Sub Directories under getCacheDir()
- python-3.x - pycallgraph 模块 - 无属性配置
- wolfram-mathematica - 如何在 Matheamtica 中输入延续'...'
- amazon-web-services - 如何在 Kinesis 服务器端记录 IP、时间戳和用户代理
- vim - 如何在vim中自动转换已处理的文件,因为它们是读/写的?