Domain driven design 如何使用DDD中的实体持久化/恢复聚合根?

Domain driven design 如何使用DDD中的实体持久化/恢复聚合根?,domain-driven-design,persistence,aggregate,ddd-repositories,aggregateroot,Domain Driven Design,Persistence,Aggregate,Ddd Repositories,Aggregateroot,基于领域驱动设计的以下定义:解决软件核心的复杂性 聚合为: 一组相关对象,它们被视为一个单元,用于数据更改。外部引用仅限于聚合中指定为根的一个成员。在聚合的边界内应用一组一致性规则 我认为聚合根不应该包含对存储库的引用。由于聚合根是唯一应该保存对其实体和聚合的引用的根,因此它们应该是私有的 我的存储库如何持久化和恢复此私有数据 编辑: 让我们以经典的订单、订单行为例 订单是聚合根 它的线条是实体 由于聚合根(Orthor)是唯一允许对其实体(订单行)进行引用的对象,所以我不知道如何保存存储库中

基于领域驱动设计的以下定义:解决软件核心的复杂性

聚合为: 一组相关对象,它们被视为一个单元,用于数据更改。外部引用仅限于聚合中指定为根的一个成员。在聚合的边界内应用一组一致性规则

我认为聚合根不应该包含对存储库的引用。由于聚合根是唯一应该保存对其实体和聚合的引用的根,因此它们应该是私有的

我的存储库如何持久化和恢复此私有数据


编辑:

让我们以经典的订单、订单行为例

订单是聚合根

它的线条是实体


由于聚合根(Orthor)是唯一允许对其实体(订单行)进行引用的对象,所以我不知道如何保存存储库中的订单行。

< P>嗯,大多数人认为存储库是聚合根的逻辑特征(因为在传统DDD中每个集合只有一个)。因此,它确实应该能够访问订单行


但是,如果您真的希望它们是私有的,那么您需要求助于反射,或者让聚合根实体以某种持久的方式返回它们(可能是某种内部调用)。

据我所知,聚合根必须是访问其作用域内所有实体的地方。这意味着,只要使用传统的ORM,就可以通过订单访问订单行

此外,不禁止任何人获取对根中实体的引用,但这些引用必须是易变的(即短生命),并且必须通过聚合根获得重引用

就DDD而言,您将使用存储库来隐藏数据访问,工厂可能反过来使用工厂来组装对象。facotry非常了解对象的内部结构,必须能够构建新对象或从存储库移交的数据中恢复一个对象


也许您还可以研究CQRS+事件源,它提供了一种不同的方法来持久化实体。

您使用什么作为数据访问策略?ORM,CQS,…?嗯,可能是ORM,但我不确定。我是DDD新手,我更担心的是,如果聚合根不公开其实体,我将无法持久化它们。乍一看,您的问题似乎是关于存储库和语言的具体实现。你能说得更具体些吗?例如,您使用的是.NET、Java还是其他什么?您是否计划使用Hibernate或Entity Framework或RoR中的内置ORM?ORM框架使用反射检查聚合结构并提取数据库友好的数据结构。存储库接口应该不知道聚合中有什么,但存储库实现无法了解它,,,,,这是合理的,工厂不起作用,因为工厂用于构建一个尚未存在且可能随后会持久化的聚合。我同意,我看不出不暴露这些物体有什么意义。在我看来,有效性是由AR维护的。在域层之前,CQRS/ES所做的事情与CRUD应用程序所做的事情完全相同。聚合的持久化方式对客户端代码是隐藏的,但您仍然可以通过存储库访问它们