Android studio 如何在分离本地和远程数据源的同时保持后端的当前体系结构?

Android studio 如何在分离本地和远程数据源的同时保持后端的当前体系结构?,android-studio,kotlin,interface,repository,dagger-2,Android Studio,Kotlin,Interface,Repository,Dagger 2,长话短说,试图利用谷歌的良好做法。我犯了一个错误,在Di项目中使用了匕首2。现在我被卡住了。我沿着小路走 我正在尝试分离本地数据(ld)源和远程数据(rd)源,同时尽可能保持现有的体系结构。我目前有两个数据源ld和rd,它们实现了数据源接口。我的存储库只识别来自该接口的功能。在谷歌的例子中,它们在两个数据源中共享相同的功能,而我的项目与此不同,它们应该具有不同的功能。(Ld应该在DB中插入引号,而remote应该只获取引号) 我尝试了创建一个新的接口来实现数据源,但是这个接口是特定于本地数据源的

长话短说,试图利用谷歌的良好做法。我犯了一个错误,在Di项目中使用了匕首2。现在我被卡住了。我沿着小路走 我正在尝试分离本地数据(ld)源和远程数据(rd)源,同时尽可能保持现有的体系结构。我目前有两个数据源ld和rd,它们实现了数据源接口。我的存储库只识别来自该接口的功能。在谷歌的例子中,它们在两个数据源中共享相同的功能,而我的项目与此不同,它们应该具有不同的功能。(Ld应该在DB中插入引号,而remote应该只获取引号)

我尝试了创建一个新的接口来实现数据源,但是这个接口是特定于本地数据源的,但是没有成功,我一直从dagger那里得到一个丢失的绑定错误

class QuoteLocalDataSource构造函数(//用于获取本地存储的引号,可以保存最喜爱的quootes或保存json引号
私人val quotesDao:quotesDao,
private val ioidispatcher:CoroutineDispatcher=Dispatchers.IO
):QuoteDataSource{
重写suspend fun getQuotes():Result=withContext(Iiodispatcher){
return@withContext试一试{
成功(quotesDao.getQuotes())
}捕获(e:例外){
结果.错误(IOException(“无法获取引号!”)
}
}
类QuoteRemoteDataSource@Inject构造函数(
私人增值税服务:QuoteApi
):QuoteDataSource{
重写suspend fun getQuotes():结果{
val response=apiService.getQuotes().await()
试一试{
if(response.issucessful)
如果(!response.body().isNullOrEmpty())
返回Result.Success(response.body())作为结果
返回结果。错误(IOException(“获取引号时出错!”)
}捕获(e:例外){
结果.错误(IOException(“无法获取引号!”)
}
返回结果。错误(IOException(“无法获取引号!”)
}

我试图让localdata source拥有默认quote存储库可以识别的自己的函数。就好像我只是向localds添加函数一样,它们在存储库中是不可用的。

例如,您可以完全删除存储库,例如使用
LiveData
从本地数据源读取以获取updates,而“远程数据源”将获取数据,然后直接将获取的数据写入本地数据库…可能就是这样谢谢
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!"))
    }