用几行来解释它有点复杂,因为建模决策来自对 DDD、CQ(R)S、快速读取模型、最终一致性等的深入理解。
正如手册所说:“查询持久层或任何数据源以获取特定于应用程序接口的对象”。这里的关键字是Interface。在图形 UI 的情况下,查找器的使用是检索具体视图以将其呈现在桌面表单或网页中。在非 CRUD 应用程序中,UI 应该是基于任务的,因此:
- 您的视图与您的实体和聚合不匹配。
- 您的实体和聚合不(不应该)包含选择数据的完整列表,即:州和城市(经典级联依赖组合框)
- 您的聚合和实体不(不应该)包含引用实体的完整列表(具有大量订单的客户类,其中包含所有订单数据,是错误的 DDD 聚合建模),但您必须在应用程序的某个位置显示完整的订单列表。
- 您的视图和聚合可以从不同的数据源中检索(通常是为了查询性能和/或最终一致性)。即NoSql readmodels,非规范化的关系数据库或域关系数据库中的预计算视图(而不是代表您的实体的表)。
所以你在 UI 和聚合/实体之间有一个阻抗错配。解决这个问题的最好方法是明确地创建一种处理从持久性到视图的方法。查找器开始发挥作用。
当用户发出一个暗示您的域发生更改的命令时,您必须检索一个聚合并将聚合根用作操作的入口点。这确保了域的一致性和不变量(规则)。聚合建模有很多细微差别(看这里),这使得尝试为视图使用聚合和实体是个坏主意。因此,您需要一种从数据源读取和构建内存聚合的方法。这是存储库的工作。有时,存储库会为您提供在检索视图数据时不需要的额外功能,例如实体更改跟踪、创建唯一标识以持久保存等。在处理视图时,您不需要任何这些。存储库开始发挥作用。