假设您想要实现一个存储库模式来处理应用程序的数据。成像有两个数据源:
database)
该服务不允许进行更改,但只允许检索数据,因此数据源的一个非常简单的接口可以是
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正在实现的另一个接口。
你认为在这种情况下最好的方法是什么?
发布于 2021-12-19 11:49:13
我认为您在正确的路径上,但是您的存储库在任何时候都应该知道数据将来自哪个数据源,它是通过网络还是本地数据源获取的。
因此,当VM从回购层请求一些数据时,回购层应该决定这些数据来自何处。它将首先检查本地数据源,然后如果数据不可用,则将通过网络获取数据。
因此,您的存储库应该有一个数据源,它将是接口的直接子级,而后者又将是本地和远程数据源接口的子级。
样本代码
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;
}https://stackoverflow.com/questions/70410649
复制相似问题