具有多个远程数据源的存储库模式
Repository pattern with multiple remote data sources
我最近开始学习 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;
}
}
如您所见,我传递的内容改变了结构,如果我将来要移动到不同的数据库,我将不得不在使用存储库的所有地方进行重构。 我怎么能improve/fix这个?
我提供了一个流程的小图:
我确定可能有更好的解决方案,但我只是引入了另一层抽象
我最近开始学习 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;
}
}
如您所见,我传递的内容改变了结构,如果我将来要移动到不同的数据库,我将不得不在使用存储库的所有地方进行重构。 我怎么能improve/fix这个?
我提供了一个流程的小图:
我确定可能有更好的解决方案,但我只是引入了另一层抽象