Android clean 架构和相关实体

标签 android repository-pattern clean-architecture

这主要是一个设计问题。我有 2 个实体 PaymentUser , 具有一对一的关系。 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 查询。
  • single responsibility principle指出每个存储库应该只处理它自己的实体,所以我不能创建 PaymentRepository并从那里处理一切。
  • 我也不能将这两个实体组合成一个聚合并创建一个存储库来处理它们,因为它们是两个独立的实体,可以独立存在。

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

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

最佳答案

根据我的理解,SRP 并没有说每个存储库应该只处理它自己的实体——相反,每个存储库应该只有“一个单一的更改原因”。

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

事实上,blob 叔叔在他的“整洁架构”一书中指出,存储库接口(interface)的设计应该以方便用户使用的方式进行。它应该有一个“每个查询”的方法,用例将针对存储库提出。

关于Android clean 架构和相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52292717/

相关文章:

android - Google http/oauth2 api 总是为第二个 HTTPRequest 抛出 EOFException

android - 建议使用较新的 Android Gradle 插件来使用 compileSdk = 32

unit-testing - 测试在 Clean 架构中做不止一件事的 Interactor 方法

node.js - 如何按照存储库模式从 nodeJS 应用程序中的服务和存储库中抛出错误

asp.net-mvc - 自定义授权/身份验证与存储库模式

clean-architecture - 存储库应该能够与实体一起工作还是只返回数据?

android - Google Play - 上传新 APK 失败 - 带有指纹的不同证书

java - 无法使用 CursorAdapter 子类过滤 ListView

c# - 如何使我的 DAL 内部的 EF 代码优先类的某些属性?