그래서 저는 원격 데이터 소스로이 앱을 작성하고 있습니다. 그리고 로컬 db 스토리지 기능을 추가하고 싶었습니다. 인터페이스가있는 아키텍처를 설정했습니다 DataSource
. A RemoteDataSource
와 LocalDataSource
클래스는 해당 인터페이스를 구현합니다. 가 RemoteDataSource
주입되고 ApiInterface
개조하고는 LocalDataSource
DAO를 주입한다.
이제이 저장소 인터페이스 및 구현 SomeDataRepository
및 SomeDataRepositoryImpl
. 리포지토리가 API에서 데이터를 가져 와서 데이터베이스에 저장할 수있게하려면 어떻게해야합니까?
현재 나는 다른 데이터 소스의 메소드에 액세스하기 위해 RemoteDataSource
및 LocalDataSource
클래스를에 모두 주입 SomeDataRepositoryImpl
했습니다. 이런 식으로 localDataSource.saveToDb()
및 / 또는 remoteDatSource.fetchSomeData()
int SomeRepositoryImpl
클래스를 호출 할 수 있습니다 . 그러나 구체적인 구현을 클래스에 전달하는 것이 갈 길인지 모르겠습니다.
하지만 전달하는 경우가 단일 말할 수 DataSource
받는 인터페이스를 SomeDataRepository
, 나는 정의해야합니다 saveToDb()
인터페이스 INT 기능을 DataSource
하고 난에 그 구현해야합니다 RemoteDataSource
좋은 것을하지 않은 아니라.
누구든지이 솔루션에 대한 최선의 접근 방식을 안내해 주시겠습니까?
또한 내가하는 동안, LiveData
개조를 위해 API 인터페이스에서 바로 래퍼 클래스로 데이터를 래핑하는 것이 좋 습니까? 리포지토리에서 메서드가 호출 될 때 생각하지 않기 때문에 리포지토리에서 바로 관찰 한 다음 데이터에 액세스하여 로컬 DB에 저장하고 싶습니다.
원격 데이터 소스에 대한 대체로서 로컬 데이터 소스 행동을 갖고 싶어하기 때문에, 당신은 또 다른 데이터 소스 구현을 생성 할 수 있습니다 구성 로컬 및 원격 데이터 소스를. 이 복합 데이터 원본은 대체 논리를 포함 할 수 있으며 필요에 따라 원격 및 로컬 데이터 원본에 대한 위임 을 처리 할 수 있습니다 . 이 작업을 마치면 Koin 모듈을 만들어이를 구성하고 복합 데이터 소스를 데이터 소스 인터페이스에 바인딩하는 것은 간단한 문제입니다.
이것이 여러분의 인터페이스이고 이미 가지고있는 두 개의 데이터 소스라고 가정합니다.
interface DataSource {
fun getData(): Data
}
class RemoteDataSource : DataSource {
// ...
}
class LocalDataSource : DataSource {
// ...
}
그런 다음 다음과 같은 세 번째 구현을 만들 수 있습니다.
class CompositeDataSource(
val remote: RemoteDataSource,
val local: LocalDataSource
) : DataSource {
override fun getData() : Data {
return try {
remote.getData()
} catch (e: Exception) {
local.getData()
}
}
}
이 모든 것을 정의하기 위해 koin 모듈은 다음과 같습니다.
module {
single { RemoteDataSource() }
single { LocalDataSource() }
single<DataSource> { CompositeDataSource(remote = get(), local = get()) }
}
편집 : 실제로 원하는 것이 캐시 인 경우 다음과 같이 로컬 데이터 소스를 캐시로 사용할 수 있습니다.
class CompositeDataSource(
val remote: RemoteDataSource,
val local: LocalDataSource
) : DataSource {
override fun getData() : Data {
return try {
remote.getData().also { local.saveData(it) }
} catch (e: Exception) {
local.getData()
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다