Короче говоря, пытаясь использовать хорошие практики 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, они не будут доступны для хранилища.