Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android清洁体系结构和相关实体_Android_Repository Pattern_Clean Architecture - Fatal编程技术网

Android清洁体系结构和相关实体

Android清洁体系结构和相关实体,android,repository-pattern,clean-architecture,Android,Repository Pattern,Clean Architecture,这主要是一个设计问题。我有两个实体支付和用户,具有一对一的关系。API调用返回一个付款列表每个付款包含一个用户。付款显示在回收器视图中,每行都包含来自付款和用户实体的信息。为了从DB(使用房间)中获取它们,我需要执行一个连接查询,该查询返回两个实体的组合: @Query("SELECT payment.*, user.* FROM payment INNER JOIN user ON payment.user_id = user.userId") fun findPaymentsAndUsers

这主要是一个设计问题。我有两个实体
支付
用户
,具有一对一的关系。API调用返回一个
付款列表
每个
付款
包含一个
用户
。付款显示在回收器视图中,每行都包含来自
付款
用户
实体的信息。为了从DB(使用房间)中获取它们,我需要执行一个连接查询,该查询返回两个实体的组合:

@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)
@Query(“从付款内部选择付款。*,用户。*在付款时加入用户。用户\u id=user.userId”)
fun findPaymentsAndUsers():列表
数据类PaymentAndUser(
@嵌入式val支付:支付,
@嵌入式val用户:用户)
我的问题是如何在不违反任何干净体系结构原则的情况下创建存储库

  • 当然,我不能创建两个独立的存储库并通过调用用例在它们之间传递数据,因为它们已经在API调用或房间DAO查询中一起返回
  • 声明每个存储库应该只处理它自己的实体,因此我不能创建一个
    PaymentRepository
    ,并从那里处理所有事情
  • 我也不能将这两个实体都分组到一个聚合中并创建一个存储库来处理它们,因为它们是两个独立的实体,可以不考虑彼此而存在
我发现的每一个Android Clean架构示例都有一个或两个完全独立的实体,没有连接查询或任何类型的分组,这在实际应用中是完全不现实的


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

据我所知,SRP并没有说每个存储库应该只处理自己的实体,而是每个存储库应该只有“一个需要更改的原因”

应该解决问题的模式是“工作单元”模式:只需创建一个“工作单元”存储库,该存储库就可以准确地处理此查询


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

您在项目中使用Interactor吗?是的,这就是我所说的用例。我将如下所示。创建一个复合用例,该用例由获取付款的用例和通过第一个用例检索的付款中的ID获取用户的用例组成。通过这样做,您的演示者只依赖于复合用例。如果我错了,请纠正我,但是当您创建用例时,您应该考虑业务事务,而不是CRUD方法。因此,在您的建议中,我们有3个用例,其中2个用例永远不能被任何其他演示者或用例使用,并且如果修改API响应,它们可能会变得无用。我开始认为问题的根源在于存储库模式本身。