聚合根方法与子方法

Agregate root vs child methods

我见过很多不同的方法,而且我对领域驱动设计方法还很陌生。我正在努力的是理解一件复杂的(至少对我而言)事情。我知道整个 DDD 起初很难理解,但我正在努力寻找我能找到的任何资源。

例子:我有一个订单,订单可以有操作。没有命令就无法访问操作,没有命令就没有意义。所以订单实体将是我的聚合根。操作也将是实体,因为每个操作都有一个 id(我说的对吗?)。每个操作都可以有子项(例如字符串数组,可以从任何操作中添加或删除这些子项)。

现在我正在努力理解并且我到处发现的是,每个修改都应该只通过聚合根调用和设置......但是在 Operation 实体本身上有像 setters 和 getters 这样的私有方法可以吗但这些只能通过聚合根(订单实体)调用?

抱歉,如果我错过了一些基本的东西,因为整个 DDD 概念对我来说是新的,我正在尝试探索它。

谢谢。

得出答案的几个 DDD 概念:

聚合是事务边界。

聚合充当对自身包含的域元素的所有更改的看门人。 对聚合及其包含的域元素的数据更改以原子方式提交。聚合中的所有内容都保持同步,或者整个状态更改操作失败。

该规则还意味着不应直接访问聚合中的域元素。最好不要在聚合上下文之外操作域对象。

如果 OperationOrder 聚合下的实体,则 Order 负责确保操作满足业务不变量(a.k.a 验证)。

聚合已全部加载。

由于Aggregate代表了一个域概念的事务和一致性边界,它的数据被完整地加载以保证所有的业务不变性都得到满足。这里的数据是指所有底层实体和值对象的数据。

如果无法加载全部数据,则无法保证更改满足所有业务不变量。这也可能意味着聚合中的 data-intensive 实体可能需要成为聚合本身。


如果您遵守这些规则,您就是在保护系统的数据完整性和操作一致性。在聚合本身中,如何组织状态变化完全由您决定。

恕我直言,我会采用您将所有 Operation 相关行为、数据属性和不变量包含在 Operation 实体中的方法。 Order 负责保护其边界内的数据,但它不需要拥有做所有事情的 methods/logic。

您也可以在 Operation 实体中创建状态更改方法,就像您在 Order 聚合中所做的那样,但是从订单对象中调用它们。