【问题标题】:Clean Architecture Repository清洁架构存储库
【发布时间】:2019-04-17 05:52:27
【问题描述】:
使用 Google 推荐的架构构建应用程序似乎是应用程序分离和模块化的好方法。话虽如此,我经常偶然发现这样一个事实,即在缓存来自 API 的数据时,可能会出现对远程和本地数据源使用不同模型的需求。 (我发现了 swankjesse 的评论 here 声明相同)。
不同的模型看起来不错,但是具有多个嵌套级别的复杂模型似乎很麻烦(将本地和远程模型映射到一个常见的data layer 实体)。
另一个论点是,当从网络请求数据时,API 可能会响应一个 JSON 映射分页和内部的其他内容(ViewModel(只是一个示例)需要加载更多数据)。
拥有带有本地和远程数据源的Repository 看起来有点毁了(本地响应对象列表,远程响应包含对象列表的类)。
我见过的所有示例应用程序都演示了使用简单 POJO(在生产代码中几乎不现实)。
有解决这个架构难题的想法吗?
【问题讨论】:
标签:
android
repository
android-architecture-components
clean-architecture
【解决方案1】:
我假设你有这样的模块,以及相应的数据模型:
- 模块
domain 和UserItem
- 模块
repository 包含 2 个数据源:模块 remote(改造 - 带有 UserResponse)和模块 local(房间 - 带有 UserEntity)。 repository 模块内还有一个 UserMapper。
为什么我们需要 3 种不同的数据模型来表示 User?因为在 3 个这样的模块中,数据具有不同的格式以及注释。例如User 将有一个birthday 字段:
- 模块
remote:class UserResponse(@SerializedName("birthday_date") val birthdayDate: String)
- 模块
local:
@Entity(tableName = "users")
class UserEntity(
@ColumnInfo(name = "birthday") val birthday: Long
)
-
domain: class UserItem(val birthdayDate: Long)
借助 3 种不同的数据模型,您可以轻松更改 domain 中的数据,而不必担心 local 或 remote 中的任何重大更改