Шаблон репозитория с несколькими удаленными источниками данных - PullRequest
0 голосов
/ 26 мая 2018

Я начал изучать разработку Android довольно недавно и совершил ошибку, создавая богослужения.Затем я узнал об архитектуре и решил преобразовать свой существующий код в архитектуру MVP.Пока все хорошо, но мое следующее узкое место - использование шаблона хранилища.Я понимаю, что хранилище - это, по сути, абстракция, которую докладчик вызывает для получения данных.Он изящно обрабатывает, когда использовать удаленный источник данных или локальный источник данных, кэширование и т. Д.

Но что, если требуется несколько источников данных?Например, я храню и извлекаю большинство данных из Firebase Firestore, но для сложных запросов и поиска я извлекаю данные (через REST через Retrofit) из экземпляра ElasticSearch.Оба они являются удаленными источниками данных.

Таким образом, вместо моего репозитория вот так:

public class BookRepository implements BookDataSource {

    private final BookDataSource remoteSource;
    private final BookDataSource localSource;

    public BookRepository(@NonNull BookDataSource remoteSource,
                          @NonNull BookDataSource localSource){
        this.remoteSource = remoteSource;
        this.localSource = localSource;
    }
}

Это выглядит примерно так:

public class BookRepository implements BookDataSource {

    private final FirebaseFirestore firestore;
    private final Retrofit retrofit;
    private final SomeLocalSource local;

    public BookRepository(@NonNull FirebaseFirestore firestore,
                          @NonNull Retrofit retrofit,
                          @NonNull SomeLocalSource local){
        this.firestore = firestore;
        this.retrofit  = retrofit;
        this.local     = local;
    }
}

Как видите, то, что я передаюменяет структуру, и если бы в будущем я перешел на другую базу данных, мне пришлось бы проводить рефакторинг везде, где используется хранилище. Как я могу улучшить / исправить это?

Я предоставил небольшую диаграмму потока:

data flow

1 Ответ

0 голосов
/ 27 мая 2018

Я уверен, что, возможно, есть лучшее решение, но я просто ввел еще один уровень абстракции

enter image description here

...