Seedstack中的存储库和Finder之间有什么区别?

时间:2016-09-16 07:26:11

标签: java jpa domain-driven-design seedstack

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

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

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

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

    • 他们从数据源中检索Dto。
  3. 它们之间唯一明显的区别是finder是数据源的只读接口。

    查找程序所需的大多数查询都可以通过调用存储库并从Aggregate转换为Dto来完成

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

1 个答案:

答案 0 :(得分:1)

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

  • 发现者

正如手册所说:“查询持久层或任何数据源以获取特定于应用程序接口的对象”。 这里的关键字是 Interface 。在图形UI的情况下,使用finder是检索具体视图以在桌面形式或网页中呈现它。在非CRUD应用中,用户界面应为Task-Based,所以:

  1. 您的观点与您的实体和汇总不符。
  2. 您的实体和汇总不(不应)包含选择数据的完整列表,即:州和城市(经典级联依赖组合框)
  3. 您的聚合和实体不(不应)包含已引用实体的完整列表(具有订单列表的客户类,所有订单数据,放在内部是错误的DDD聚合建模)但在您的应用程序中的某处必须显示完整的订单清单。
  4. 您可以从不同的数据源检索您的视图和聚合(通常用于查询性能和/或事件一致性)。即NoSql readmodels,非规范化关系数据库或预先计算的视图(而不是代表您的实体的表)。
  5. 因此,您在UI和聚合/实体之间存在阻抗误差。解决此问题的最佳方法是明确地创建一种从持久性到视图的方法。发现者发挥作用。

    • Repoisitories

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