所以我正在用远程数据源编写此应用程序。我想添加本地数据库存储功能。我已经建立了一个具有接口DataSource
的体系结构。 RemoteDataSource
和LocalDataSource
类实现该接口。 RemoteDataSource
注入了ApiInterface
改造,LocalDataSource
注入了DAO。
[现在有此存储库接口和实现SomeDataRepository
和SomeDataRepositoryImpl
。如果我希望存储库能够从api提取数据并将其保存到数据库,该如何做?
[目前,我已经将RemoteDataSource
和LocalDataSource
类都注入了SomeDataRepositoryImpl
,以访问来自不同数据源的方法。这样,我可以调用localDataSource.saveToDb()
和/或remoteDatSource.fetchSomeData()
int SomeRepositoryImpl
类。但是我不知道将具体的实现传递给类是否可行。
但是如果我将单个DataSource
接口传递给SomeDataRepository
,我将必须在接口saveToDb()
中定义一个DataSource
函数,然后我也必须在RemoteDataSource
中实现该函数这不是那么好。
任何人都可以通过最佳解决方案指导我。
而且在我这样做的时候,直接在api接口中使用LiveData
包装类包装数据是否有好处?因为我不认为在存储库上调用方法时,我想在存储库中观察它,然后访问数据以将其放入本地数据库。
由于要使本地数据源充当远程数据源的后备,因此可以创建另一个数据源实现,该实现是本地和远程数据源的composition。该复合数据源可以包含回退逻辑,并根据需要处理到远程和本地数据源的delegation。完成此操作后,只需创建一个Koin模块来构造它们,然后将复合数据源绑定到数据源接口,就很简单了。
假设这是您的界面以及您已经拥有的两个数据源:
interface DataSource {
fun getData(): Data
}
class RemoteDataSource : DataSource {
// ...
}
class LocalDataSource : DataSource {
// ...
}
然后您可以创建第三个类似的实现:
class CompositeDataSource(
val remote: RemoteDataSource,
val local: LocalDataSource
) : DataSource {
override fun getData() : Data {
return try {
remote.getData()
} catch (e: Exception) {
local.getData()
}
}
}
要定义所有这些,您的koin模块将看起来像这样
module {
single { RemoteDataSource() }
single { LocalDataSource() }
single<DataSource> { CompositeDataSource(remote = get(), local = get()) }
}