【发布时间】:2020-10-26 23:57:34
【问题描述】:
所以我正在使用远程数据源编写这个应用程序。我想添加本地数据库存储功能。我已经建立了一个架构,我有一个接口DataSource。 RemoteDataSource 和 LocalDataSource 类实现该接口。 RemoteDataSource 注入了 ApiInterface 改造,LocalDataSource 注入了 DAO。
现在有这个存储库接口和实现SomeDataRepository 和SomeDataRepositoryImpl。如果我希望存储库能够从 api 获取数据并将其保存到数据库中,我该怎么做呢?
目前我已将RemoteDataSource 和LocalDataSource 类注入SomeDataRepositoryImpl 以访问来自不同数据源的方法。这样我就可以调用类似localDataSource.saveToDb() 和/或remoteDatSource.fetchSomeData() int SomeRepositoryImpl 类的东西。但我不知道是否将具体实现传递给一个类。
但是,如果我将单个 DataSource 接口传递给 SomeDataRepository,我将必须在接口 DataSource 中定义一个 saveToDb() 函数,然后我必须在 RemoteDataSource 中实现它好吧,这不是那么好。
谁能指导我了解此解决方案的最佳方法。
而且,当我这样做的时候,在 api 接口中使用 LiveData 包装类包装数据以进行改造有什么好处吗?因为我不认为在存储库上调用方法时,我想在存储库中观察它,然后访问数据以将其放入本地数据库。
【问题讨论】:
-
你应该使用2个接口而不是只使用一个数据源。我建议您通过 RemoteDataSourceImpl 和 LocalDataSourceImpl 创建 RemoteDataSource、LocalDataSource 接口和 impl。在 SomeDataRepositoryImpl 内部传递其 2 个实例
-
developer.android.com/jetpack/docs/guide#cache-data 在这里阅读更多内容,WebService 是您的 RemoteDataSource 而 UserCache 是 LocalDataSource
-
@CôngHải 您好,谢谢您的建议。如果我要应用一些逻辑,比如 api 请求是否成功,保存到 db 然后从 db 获取。如果失败,直接从 db 获取。如果从数据库获取失败,则只显示错误。这可以在存储库类中完成吗?或者这对于存储库的责任来说太过分了?
-
你想通过什么逻辑来决定是使用本地还是远程数据源?
-
@MatthewPope 我只想在网络请求失败时使用本地数据源。这可能吗?
标签: android dependency-injection local-storage repository-pattern koin