Android清洁架构和相关实体

时间:2018-09-12 10:11:26

标签: android repository-pattern clean-architecture

这主要是一个设计问题。我有2个实体PaymentUser,具有一对一的关系。 API调用返回一个Payments列表,每个Payment包含一个User。付款显示在“回收者视图”中,每一行都包含来自PaymentUser实体的信息。为了从数据库中获取它们(使用 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中一起返回了查询。
  • single responsibility principle指出,每个存储库都只能处理自己的实体,因此我无法创建PaymentRepository并从那里处理所有内容。
  • 我也无法将两个实体都分组为 Aggregate ,并且不能创建一个处理两个实体的存储库,因为它们是两个独立的实体,彼此之间可以存在。

我发现的每个 Android Clean Architecture 示例都具有一个或两个完全独立的实体,没有连接查询或任何分组方式,这在现实生活的应用程序中是完全不现实的。

有什么方法可以正确实现吗?

1 个答案:

答案 0 :(得分:0)

据我了解,SRP并不是说每个存储库只应处理自己的实体-而是每个存储库仅应具有“更改的单个原因”。

应该解决您问题的模式是“工作单元”模式:只需创建一个“工作单元”存储库即可完全处理此查询。

实际上,blob叔叔在他的《干净的体系结构》一书中指出,存储库接口的设计应方便用户使用。它应该有一个用例针对存储库提出的“每个查询”方法。