首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理存储库模式中的异构数据源?

如何处理存储库模式中的异构数据源?
EN

Stack Overflow用户
提问于 2021-12-19 10:37:58
回答 1查看 139关注 0票数 1

假设您想要实现一个存储库模式来处理应用程序的数据。成像有两个数据源:

database)

  • Remote

  • 本地缓存(或服务(Rest ))

该服务不允许进行更改,但只允许检索数据,因此数据源的一个非常简单的接口可以是

代码语言:javascript
复制
interface DataSource {
   suspend fun getClients(): Result<List<Client>> 
   suspend fun getClient(): Result<Client>
}

remoteDataSourcecacheDataSource都将实现它。

但是,cacheDataSource需要填充数据,因此它需要一个额外的函数,比如挂起有趣的addClients(clients: List<Client>),这样我就可以将接口更改为:

代码语言:javascript
复制
interface DataSource {
   suspend fun getClients(): Result<List<Client>> 
   suspend fun getClient(): Result<Client>
   suspend fun addClients(clients: List<Client>)
}

然而,这将是不好的,因为remoteDataSource不会实现addClients。

因此,我可以从该接口中删除该函数,并使cacheDataSource实现另一个接口:

代码语言:javascript
复制
interface CacheClients {
   suspend fun cacheData(clients: List<Client>)
} 

现在的问题是,我的存储库应该只接收两个DataSource实例,它不知道cacheDataSource正在实现的另一个接口。

你认为在这种情况下最好的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-12-19 11:49:13

我认为您在正确的路径上,但是您的存储库在任何时候都应该知道数据将来自哪个数据源,它是通过网络还是本地数据源获取的。

因此,当VM从回购层请求一些数据时,回购层应该决定这些数据来自何处。它将首先检查本地数据源,然后如果数据不可用,则将通过网络获取数据。

因此,您的存储库应该有一个数据源,它将是接口的直接子级,而后者又将是本地和远程数据源接口的子级。

样本代码

代码语言:javascript
复制
interface DataSource(){
  Result<List<Client>> getClients();
  Result<Client> getClient();
}

interface Cache(){
  void caheClientData(Result<Client> data); 
}

// Marker Interace
interface CacheEnabledDataSource implements DataSource, Cache{}

class Repository{
 CacheEnabledDataSource source;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70410649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档