로컬 및 원격 데이터 소스 간 Koin Dependency Injection 전환

라비

그래서 저는 원격 데이터 소스로이 앱을 작성하고 있습니다. 그리고 로컬 db 스토리지 기능을 추가하고 싶었습니다. 인터페이스가있는 아키텍처를 설정했습니다 DataSource. A RemoteDataSourceLocalDataSource클래스는 해당 인터페이스를 구현합니다. RemoteDataSource주입되고 ApiInterface개조하고는 LocalDataSourceDAO를 주입한다.

이제이 저장소 인터페이스 및 구현 SomeDataRepositorySomeDataRepositoryImpl. 리포지토리가 API에서 데이터를 가져 와서 데이터베이스에 저장할 수있게하려면 어떻게해야합니까?

현재 나는 다른 데이터 소스의 메소드에 액세스하기 위해 RemoteDataSourceLocalDataSource클래스를에 모두 주입 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

로컬 및 원격 시스템 간의 데이터베이스 동기화

분류에서Dev

Git-로컬 및 원격 저장소에서 여러 이전 커밋 제거

분류에서Dev

로컬 로그인 및 이전 원격 데스크톱 세션 후 Windows 10 검은 색 화면

분류에서Dev

전체 화면 MS 원격 데스크톱 원격 시스템과 로컬 시스템 간의 키보드 전용 탐색

분류에서Dev

원격 배포 데이터베이스와 게시자간에 서로 다른 버전의 MS SQL Server

분류에서Dev

Dell SonicWall을 사용하는 원격 데스크톱과 로컬 데스크톱 환경간에 인터넷 필터는 어떻게 작동합니까?

분류에서Dev

원격 서버에서 로컬 스크립트 실행시 호스트 이름 및 데이터 캡처

분류에서Dev

요소 그룹에서 시간별 데이터를 일별 및 격일로 변환

분류에서Dev

MySQL : 원격 및 로컬 액세스

분류에서Dev

일반 메소드 인터페이스가있는 EJB (로컬 및 원격 아님)

분류에서Dev

로컬 데이터베이스와 Google 클라우드 SQL의 프로그램 간 전환

분류에서Dev

로컬 저장소에서 원격 이동 : Git 및 대용량 파일 삭제

분류에서Dev

로컬 및 원격 IP 전달의 차이점은 무엇입니까?

분류에서Dev

Monolog 로그를 파일 및 원격 데이터베이스에 쓰는 방법

분류에서Dev

로컬 및 원격 파일간에 여러 diff 실행

분류에서Dev

하나의 DbContext로 데이터베이스 간 전환

분류에서Dev

Eclipse에서 XDebug 원격 디버깅을 사용할 때 PHP 소스 파일이 로컬 및 원격으로 존재해야합니까?

분류에서Dev

객체는 간격 및 마이너스 계산 기호로 부동 소수점으로 변환

분류에서Dev

POST 데이터 전송 및 게시 데이터로 채워진 원격 양식 열기

분류에서Dev

웹 앱과 데이터베이스를 서로 다른 서버 (원격 및 로컬)에서 호스팅 할 수 있습니까?

분류에서Dev

원격 데스크톱이 간헐적으로 멈춤

분류에서Dev

로컬 및 원격 스냅 샷과 관련된 Maven 업데이트 정책 스냅 샷

분류에서Dev

로컬 git 저장소 및 원격에서 이름이 변경된 파일에 이제 이전 파일과 새 파일이 모두 있습니다.

분류에서Dev

원격 호스트에서 Entity Framework 및 SQL Server로 데이터베이스를 업데이트하는 방법

분류에서Dev

개체 및 개체 간 전환을 나타내는 좋은 데이터 구조 또는 데이터베이스?

분류에서Dev

원격 데이터 소스로 채워진 kendo ui 목록보기에 "전체"항목 추가

분류에서Dev

로컬 및 라이브 용 다른 cakephp 데이터 소스

분류에서Dev

이미 마스터와 병합 된 사용하지 않는 분기 (로컬 및 원격) 삭제

분류에서Dev

Android : listview 대신 gridview에서 원격 데이터베이스의 데이터 표시 (ListView를 GridView로 변환)

Related 관련 기사

  1. 1

    로컬 및 원격 시스템 간의 데이터베이스 동기화

  2. 2

    Git-로컬 및 원격 저장소에서 여러 이전 커밋 제거

  3. 3

    로컬 로그인 및 이전 원격 데스크톱 세션 후 Windows 10 검은 색 화면

  4. 4

    전체 화면 MS 원격 데스크톱 원격 시스템과 로컬 시스템 간의 키보드 전용 탐색

  5. 5

    원격 배포 데이터베이스와 게시자간에 서로 다른 버전의 MS SQL Server

  6. 6

    Dell SonicWall을 사용하는 원격 데스크톱과 로컬 데스크톱 환경간에 인터넷 필터는 어떻게 작동합니까?

  7. 7

    원격 서버에서 로컬 스크립트 실행시 호스트 이름 및 데이터 캡처

  8. 8

    요소 그룹에서 시간별 데이터를 일별 및 격일로 변환

  9. 9

    MySQL : 원격 및 로컬 액세스

  10. 10

    일반 메소드 인터페이스가있는 EJB (로컬 및 원격 아님)

  11. 11

    로컬 데이터베이스와 Google 클라우드 SQL의 프로그램 간 전환

  12. 12

    로컬 저장소에서 원격 이동 : Git 및 대용량 파일 삭제

  13. 13

    로컬 및 원격 IP 전달의 차이점은 무엇입니까?

  14. 14

    Monolog 로그를 파일 및 원격 데이터베이스에 쓰는 방법

  15. 15

    로컬 및 원격 파일간에 여러 diff 실행

  16. 16

    하나의 DbContext로 데이터베이스 간 전환

  17. 17

    Eclipse에서 XDebug 원격 디버깅을 사용할 때 PHP 소스 파일이 로컬 및 원격으로 존재해야합니까?

  18. 18

    객체는 간격 및 마이너스 계산 기호로 부동 소수점으로 변환

  19. 19

    POST 데이터 전송 및 게시 데이터로 채워진 원격 양식 열기

  20. 20

    웹 앱과 데이터베이스를 서로 다른 서버 (원격 및 로컬)에서 호스팅 할 수 있습니까?

  21. 21

    원격 데스크톱이 간헐적으로 멈춤

  22. 22

    로컬 및 원격 스냅 샷과 관련된 Maven 업데이트 정책 스냅 샷

  23. 23

    로컬 git 저장소 및 원격에서 이름이 변경된 파일에 이제 이전 파일과 새 파일이 모두 있습니다.

  24. 24

    원격 호스트에서 Entity Framework 및 SQL Server로 데이터베이스를 업데이트하는 방법

  25. 25

    개체 및 개체 간 전환을 나타내는 좋은 데이터 구조 또는 데이터베이스?

  26. 26

    원격 데이터 소스로 채워진 kendo ui 목록보기에 "전체"항목 추가

  27. 27

    로컬 및 라이브 용 다른 cakephp 데이터 소스

  28. 28

    이미 마스터와 병합 된 사용하지 않는 분기 (로컬 및 원격) 삭제

  29. 29

    Android : listview 대신 gridview에서 원격 데이터베이스의 데이터 표시 (ListView를 GridView로 변환)

뜨겁다태그

보관