【发布时间】:2018-07-20 22:31:14
【问题描述】:
我正在寻找一种方法来改进我的应用中不同层的模型类之间的映射机制。
我在业务逻辑层(例如 Presenter)中有模型类,即我在应用程序中使用的模型类。例如一个用户类。
我有服务器端实体,我使用这些实体通过 Retrofit 或任何其他技术反序列化来自服务器端端点的响应。这些通常包含字段的 Gson 注释。例如 ApiUserResponse 类。
我有 DTO 实体,这些实体代表我的应用程序中的数据库表。我现在正在使用 Realm,但我使用过 ORMlite 和 Room。这些类型的类还包含与 DB 相关的注释。例如 UserDTO 类。
我的缓存存储库(从数据库获取数据的存储库)和我的网络存储库(从服务器端获取数据的存储库)都公开了 RxJava 方法,返回包装在 Observable 类中的响应。
我现在解析 DTO 实体和服务器端实体的工作是将扩展函数添加到 Observable 类,该类接收函数作为参数。这就是我用来将 DTO 和服务器端实体解析为模型类的机制。例如:
myLoginRepository.getUser("someId")
.mapTo(::myMappingFunction)
...
fun myMappingFunction(userResponse: ApiUserResponse): User {
return User(userResponse.id, userResponse.name, userResponse.lastname)
}
在内部,mapTo 扩展函数所做的唯一事情是使用 flatMap 来扁平化 Observable 流并使用映射来解析集合。
我认为这是实现模型相关类之间映射的一种很好的方法,但我正在寻找一种改进方法或做一些完全不同但需要更少编码的方法。显然这个例子非常简单,但目前我有一个 Mappings.kt 文件,随着每个新的映射函数,它都在疯狂增长。
有什么建议吗?
【问题讨论】:
-
你应该在每一层都有映射类文件,只涉及同一层的模型类。
-
请问,你能分享你的 Observable 扩展 mapTo() 吗?谢谢!
标签: android kotlin mapping kotlin-extension