2

基于来自领域驱动设计了以下定义:抢断复杂性软件的核心,你如何坚持/恢复DDD实体的聚合根?

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

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

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


编辑:

让我们以经典的订单,OrderLines例子。

订单是汇总根。

它的线条是实体。

由于聚合根(顺序)是唯一允许持有对其实体(顺序行)的引用的对象,所以我不明白我将如何从存储库中持久化命令行。

+0

你用什么作为数据访问策略? ORM,CQRS,...? – 2011-02-28 19:57:06

+0

嗯,可能是ORM,但我不确定。我是DDD的新手,我的顾虑更多的是这样一个事实,即如果聚合根不公开它的实体,我将无法坚持它们。 – Martin 2011-02-28 20:24:20

+0

乍看之下,您的问题似乎是在询问存储库和语言的具体实现。你可以说得更详细点吗?例如,你使用的是.NET还是Java或其他?您是否打算在RoR中使用Hibernate或Entity Framework或内置的ORM? – 2011-08-10 03:27:06

回答

3

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

此外,任何人都不可以获取对根内引用的引用,但这些引用必须是易失性的(即短暂的),并且您必须通过聚合根获得rerefence。

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

也许你可能也会考虑CQRS +事件采购,它提供了一种持久实体的不同方法。

+0

我同意,在没有公开这些对象时我看不到太多目的。我认为AR的有效性是由AR维护的。 – 2011-08-10 03:25:37

0

那么,大多数人认为仓库是聚合根的逻辑特征(因为在传统的DDD中每个聚合只有一个),所以它&应该有权访问命令行。但是,如果你真的希望它们是私有的,你需要求助于反射,否则让聚合根实体以某种可持久的方式返回它们(也许不带有某种内部调用)。