Как я могу сохранить свою текущую архитектуру серверной части, разделяя мои локальные и удаленные источники данных? - PullRequest
0 голосов
/ 10 ноября 2019

Короче говоря, пытаясь использовать хорошие практики Google. Я допустил ошибку перехода кинжала 2 на проект Di. И теперь я застрял. Я следовал по архитектуре Sunflower Я пытаюсь разделить локальный источник данных (ld) и удаленный источник данных (rd), сохраняя при этом имеющуюся у меня архитектуру. В настоящее время у меня есть 2 источника данных ld и rd, которые реализуют интерфейс источника данных. И мой репозиторий распознает только функции из этого интерфейса. В примере googles они совместно используют одни и те же функции в обоих источниках данных, в то время как мой проект расходится с этим, и они должны иметь разные функции. (Ld должен вставлять кавычки в БД, в то время как удаленный должен просто извлекать кавычки)

Я попытался создать новый интерфейс, который реализует источник данных, но специфический для локального источника данных, и он не работал, продолжаю получатьотсутствует ошибка привязки из кинжала.

проект Github

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!"))
    }

Я как-то пытаюсь, чтобы источник localdata имел свои собственные функциикоторые распознаются репозиторием цитат по умолчанию. Как будто я просто добавляю функции в localds, они не будут доступны для хранилища.

...