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

Posted

技术标签:

【中文标题】如何处理存储库模式中的异构数据源?【英文标题】:How to deal with heterogeneous data sources in repository pattern? 【发布时间】:2022-01-21 09:51:58 【问题描述】:

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

    本地缓存(或数据库) 远程服务(Rest API)

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

interface DataSource 
   suspend fun getClients(): Result<List<Client>> 
   suspend fun getClient(): Result<Client>

remoteDataSourcecacheDataSource 都会实现它。

但是,cacheDataSource 需要填充数据,所以它需要一个额外的功能,比如暂停乐趣addClients(clients: List&lt;Client&gt;),所以我可以将界面更改为:

interface DataSource 
   suspend fun getClients(): Result<List<Client>> 
   suspend fun getClient(): Result<Client>
   suspend fun addClients(clients: List<Client>)

但这会很糟糕,因为remoteDataSource 不会实现 addClients。

所以我可以从该接口中删除该函数并让cacheDataSource 实现另一个接口:

interface CacheClients 
   suspend fun cacheData(clients: List<Client>)
 

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

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

【问题讨论】:

【参考方案1】:

我认为您大部分时间都在正确的路径上,但您的存储库应该始终知道数据来自哪个数据源,因为它是通过网络或本地数据源获取的。

因此,当您的虚拟机从 repo 层请求一些数据时,repo 层应该决定这些数据的来源。它将首先检查本地数据源,如果数据不可用,它将通过网络获取。

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

示例代码

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;

【讨论】:

以上是关于如何处理存储库模式中的异构数据源?的主要内容,如果未能解决你的问题,请参考以下文章

你如何处理无状态 grails 服务中的共享数据

如何处理来自存储在vue中的空数据

本地到云端数据如何处理

如何处理存储在数据库中的大量文档?

模型数据库中的异构类型

如何处理数据仓库中的图关系?