这主要是一个设计问题。我有 2 个实体 Payment
和 User
, 具有一对一的关系。 API 调用返回 Payments
的列表每个Payment
包含 User
.付款显示在 Recycler View 中,每一行都包含来自 Payment
的信息和 User
实体。为了从数据库中获取它们(使用 Room),我需要执行一个返回两个实体组合的连接查询:
@Query("SELECT payment.*, user.* FROM payment INNER JOIN user ON payment.user_id = user.userId")
fun findPaymentsAndUsers(): List<PaymentAndUser>
data class PaymentAndUser(
@Embedded val payment: Payment,
@Embedded val user: User)
我的问题是如何在不违反任何整洁架构原则的情况下创建我的存储库?
- 当然,我不能创建 2 个独立的存储库并通过调用 UseCase 在它们之间传递数据,因为它们已经在 API 调用或 Room DAO中一起返回em> 查询。
- single responsibility principle指出每个存储库应该只处理它自己的实体,所以我不能创建
PaymentRepository
并从那里处理一切。 - 我也不能将这两个实体组合成一个聚合并创建一个存储库来处理它们,因为它们是两个独立的实体,可以独立存在。
我发现的每个 Android Clean Architecture 示例都有一个或两个完全独立的实体,没有连接查询或任何类型的分组,这在现实生活中的应用程序中是完全不现实的。
有什么方法可以正确实现吗?
最佳答案
根据我的理解,SRP 并没有说每个存储库应该只处理它自己的实体——相反,每个存储库应该只有“一个单一的更改原因”。
应该解决您的问题的模式是“工作单元”模式:只需创建一个准确处理此查询的“工作单元”存储库。
事实上,blob 叔叔在他的“整洁架构”一书中指出,存储库接口(interface)的设计应该以方便用户使用的方式进行。它应该有一个“每个查询”的方法,用例将针对存储库提出。
关于Android clean 架构和相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52292717/