如何使用DDD中的实体持久保存/恢复聚合根?

时间:2011-02-28 16:03:46

标签: domain-driven-design persistence aggregate ddd-repositories aggregateroot

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

汇总是: 一组关联对象,它们被视为一个单元,用于更改数据。外部引用仅限于AGGREGATE的一个成员,指定为根。一组一致性规则适用于AGGREGATE的边界。

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

我的存储库如何保留并恢复此私人数据?


编辑:

我们来看看经典的Order,OrderLines示例。

订单是聚合根。

它的行是实体。

由于Aggregate root(order)是唯一允许保存对其实体(订单行)的引用的对象,我不明白如何从存储库中保留订单行。

2 个答案:

答案 0 :(得分:3)

据我了解聚合根,它必须是访问其范围内所有实体的地方。这意味着,只要使用传统的ORM,您就可以通过订单访问OrderLines。

此外,任何人都不禁止在根目录中获取对权限的引用,但这些引用必须是易失性的(即短暂的),并且必须通过聚合根获得rerefence。

就DDD而言,您将使用存储库来隐藏数据访问,工厂可能会使用工厂来组装对象。 facotry很清楚对象的内部结构,并且必须能够建立一个新对象或从存储库移交的数据中恢复一个。

也许您也可以研究CQRS +事件采购,它为持久化实体提供了不同的方法。

答案 1 :(得分:0)

好吧,大多数人认为存储库是hte聚合根的逻辑特征(因为在传统的DDD中每个聚合只有一个),所以它确实&应该有权访问订单。

如果你真的希望它们是私有的,你需要求助于反射,否则让聚合根实体以某种可持续的方式返回它们(也许是某种内部调用)。