Seedstack 中的 Repository 和 Finder 有什么区别?

What's the difference between a Repository and a Finder in Seedstack?

我正在使用 Seedstack 16.7 及其支持 JPA 插件的业务框架。

有两种方法可以从数据源获取数据。

  1. 存储库http://seedstack.org/docs/business/manual/repositories/

    • 它们几乎是代表 JPA 上的传统 EntityManager 的行为,保持类型安全。
  2. 发现者http://seedstack.org/docs/business/manual/finders/

    • 他们从数据源中检索 Dto。

它们之间唯一明显的区别是 finder 是数据源的只读接口。

Finder 所需的大部分查询都可以通过调用存储库并将聚合转换为 Dto 来完成

它们之间或它们的意图有什么真正的区别吗? 除了在这个问题上提到的。

用几行来解释它有点复杂,因为建模决策来自对 DDD、CQ(R)S、快速读取模型、最终一致性等的深刻理解

  • 发现者

正如手册所说:"Query the persistence layer or any data source to obtain objects specific to an interface of the application"。 这里的关键词是Interface。在图形 UI 的情况下,查找器的使用是检索具体视图以将其呈现在桌面表单或网页中。在非 CRUD 应用程序中,UI 应该是 Task-Based,所以:

  1. 您的观点与您的实体和聚合不匹配。
  2. 您的实体和聚合不(不应)包含选择数据的完整列表,即:州和城市(classic 级联依赖组合框)
  3. 您的聚合和实体不(不应)包含引用实体的完整列表(客户 class 有大量订单,所有订单数据都放在里面是错误的 DDD 聚合建模)但在您的应用程序中的某个地方,您必须显示完整的订单列表。
  4. 您的视图和聚合可以从不同的数据源中检索(通常是为了查询性能 and/or 最终一致性)。即 NoSql readmodels,非规范化关系数据库或域关系数据库中的预计算视图(而不是表示实体的表)。

所以你在 UI 和 Aggregates/Entities 之间有一个阻抗错配。解决这个问题的最好方法是明确地创建一种从持久化到查看的处理方式。 Finders 开始发挥作用。

  • 存储库

当用户发出暗示您的域发生更改的命令时,您必须检索聚合并将聚合根用作操作的入口点。这确保了域的一致性和不变性(规则)。聚合建模有很多细微差别(请看一下 here),因此尝试将聚合和实体用于您的视图是个坏主意。因此,您需要一种从数据源读取和构建内存聚合的方法。这是存储库的工作。有时,存储库会为您提供在为视图检索数据时不需要的额外功能,例如实体更改跟踪、创建唯一标识以持久保存等。在处理视图时,您不需要这些。存储库开始发挥作用。