如何处理存储库模式中的异构数据源?
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>
remoteDataSource
和 cacheDataSource
都会实现它。
但是,cacheDataSource
需要填充数据,所以它需要一个额外的功能,比如暂停乐趣addClients(clients: List<Client>)
,所以我可以将界面更改为:
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;
【讨论】:
以上是关于如何处理存储库模式中的异构数据源?的主要内容,如果未能解决你的问题,请参考以下文章