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

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

  1. 本地缓存(或数据库)
  2. 远程服务(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 正在实现的另一个接口。

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

【问题讨论】:

    标签: android design-patterns repository-pattern android-architecture-components


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2015-07-18
      • 2011-08-01
      相关资源
      最近更新 更多