我目前正在开发一个新闻提要 android 应用程序。我尝试根据干净架构的原则设计我的应用程序。
在数据层中,我使用存储库模式作为不同数据源的外观:来自 API ( https://newsapi.org/ ) 的远程数据、来自数据库 (Realm 或 SQLite) 的本地数据以及一些在-内存缓存。
在我的领域层中,我定义了一些不可变的模型类(Article、NewsSource 等),它们正在被领域层和表示层使用(我认为表示层中不需要额外的模型类)。
对远程数据源和本地数据源使用不同的模型类是否有意义?
例如,远程数据源使用 Retrofit 进行 API 调用,模型需要被注释以便被 GSON 解析。
data class RemoteArticleModel(
@SerializedName("title") val title: String,
@SerializedName("urlToImage") val urlToImage: String,
@SerializedName("url") val url: String)
本地数据源的模型也可能必须履行某些特定合同,例如 Realm DB 中的模型需要扩展 RealmObject。
open class Dog : RealmObject() {
var name: String? = null
@LinkingObjects("dog")
val owners: RealmResults<Person>? = null
}
显然,我不希望我的域模型被任何特定于数据源的合同(注释、RealmObject 继承等)“污染”。所以我认为对不同的数据源使用不同的模型是有意义的,并且存储库会处理它们之间的映射。
例如,我们想从远程 API 中获取所有文章,将它们存储在本地数据库中,然后将它们返回给领域层。
流程就像:
远程数据源向新闻 api 发出 http 请求并检索RemoteArticleModel
´s 列表。存储库会将这些模型映射到特定领域的文章模型 ( Article
)。然后这些将被映射到数据库模型(例如RealmArticleModel
)并插入到数据库中。最后,Article
's 列表将返回给调用者。
出现了两个问题: 上面的例子显示了使用这种方法会有多少分配。对于要下载并插入数据库的每篇文章,将在该过程中创建三个模型。会不会太过分了?
另外,我知道数据层应该使用与域层不同的模型类(内层不应该与外层无关)。但是在上面的例子中这有什么意义。对于两个不同的数据源,我已经有了两个不同的模型类。添加第三个被数据层/存储库用作“中介”模型以处理到其他模型(远程、本地、域)的映射将增加更多的分配。
那么数据层是否应该对领域模型一无所知,让领域做从数据层模型到领域层模型的映射呢?
是否应该有一个仅由存储库/数据层使用的通用模型?
谢谢,我非常感谢更有经验的开发人员提供的任何帮助:)