具有多个远程数据源的存储库模式

时间:2018-05-26 20:51:54

标签: android design-patterns mvp

我最近开始学习Android开发,并犯了创造神活动的错误。然后我学习了体系结构,并选择将现有代码重构为MVP体系结构。到目前为止这么好,但我的下一个瓶颈是使用存储库模式。我知道存储库本质上是一个抽象,主持人调用它来获取数据。它可以优雅地处理何时使用远程数据源或本地数据源,缓存等。

但如果需要多个数据源呢?例如,我存储并从Firebase Firestore中提取大部分数据,但是对于复杂的查询和搜索,我从ElasticSearch实例中提取数据(通过REST通过Retrofit)。这两个都是远程数据源。

因此,不要像我这样拥有我的存储库:

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 :(得分:-1)

我确信可能有更好的解决方案,但我只是引入了另一层抽象

enter image description here