聚合根方法与子方法
Agregate root vs child methods
我见过很多不同的方法,而且我对领域驱动设计方法还很陌生。我正在努力的是理解一件复杂的(至少对我而言)事情。我知道整个 DDD 起初很难理解,但我正在努力寻找我能找到的任何资源。
例子:我有一个订单,订单可以有操作。没有命令就无法访问操作,没有命令就没有意义。所以订单实体将是我的聚合根。操作也将是实体,因为每个操作都有一个 id(我说的对吗?)。每个操作都可以有子项(例如字符串数组,可以从任何操作中添加或删除这些子项)。
现在我正在努力理解并且我到处发现的是,每个修改都应该只通过聚合根调用和设置......但是在 Operation 实体本身上有像 setters 和 getters 这样的私有方法可以吗但这些只能通过聚合根(订单实体)调用?
抱歉,如果我错过了一些基本的东西,因为整个 DDD 概念对我来说是新的,我正在尝试探索它。
谢谢。
得出答案的几个 DDD 概念:
聚合是事务边界。
聚合充当对自身包含的域元素的所有更改的看门人。
对聚合及其包含的域元素的数据更改以原子方式提交。聚合中的所有内容都保持同步,或者整个状态更改操作失败。
该规则还意味着不应直接访问聚合中的域元素。最好不要在聚合上下文之外操作域对象。
如果 Operation
是 Order
聚合下的实体,则 Order
负责确保操作满足业务不变量(a.k.a 验证)。
聚合已全部加载。
由于Aggregate代表了一个域概念的事务和一致性边界,它的数据被完整地加载以保证所有的业务不变性都得到满足。这里的数据是指所有底层实体和值对象的数据。
如果无法加载全部数据,则无法保证更改满足所有业务不变量。这也可能意味着聚合中的 data-intensive 实体可能需要成为聚合本身。
如果您遵守这些规则,您就是在保护系统的数据完整性和操作一致性。在聚合本身中,如何组织状态变化完全由您决定。
恕我直言,我会采用您将所有 Operation
相关行为、数据属性和不变量包含在 Operation
实体中的方法。 Order
负责保护其边界内的数据,但它不需要拥有做所有事情的 methods/logic。
您也可以在 Operation
实体中创建状态更改方法,就像您在 Order
聚合中所做的那样,但是从订单对象中调用它们。
我见过很多不同的方法,而且我对领域驱动设计方法还很陌生。我正在努力的是理解一件复杂的(至少对我而言)事情。我知道整个 DDD 起初很难理解,但我正在努力寻找我能找到的任何资源。
例子:我有一个订单,订单可以有操作。没有命令就无法访问操作,没有命令就没有意义。所以订单实体将是我的聚合根。操作也将是实体,因为每个操作都有一个 id(我说的对吗?)。每个操作都可以有子项(例如字符串数组,可以从任何操作中添加或删除这些子项)。
现在我正在努力理解并且我到处发现的是,每个修改都应该只通过聚合根调用和设置......但是在 Operation 实体本身上有像 setters 和 getters 这样的私有方法可以吗但这些只能通过聚合根(订单实体)调用?
抱歉,如果我错过了一些基本的东西,因为整个 DDD 概念对我来说是新的,我正在尝试探索它。
谢谢。
得出答案的几个 DDD 概念:
聚合是事务边界。
聚合充当对自身包含的域元素的所有更改的看门人。 对聚合及其包含的域元素的数据更改以原子方式提交。聚合中的所有内容都保持同步,或者整个状态更改操作失败。
该规则还意味着不应直接访问聚合中的域元素。最好不要在聚合上下文之外操作域对象。
如果 Operation
是 Order
聚合下的实体,则 Order
负责确保操作满足业务不变量(a.k.a 验证)。
聚合已全部加载。
由于Aggregate代表了一个域概念的事务和一致性边界,它的数据被完整地加载以保证所有的业务不变性都得到满足。这里的数据是指所有底层实体和值对象的数据。
如果无法加载全部数据,则无法保证更改满足所有业务不变量。这也可能意味着聚合中的 data-intensive 实体可能需要成为聚合本身。
如果您遵守这些规则,您就是在保护系统的数据完整性和操作一致性。在聚合本身中,如何组织状态变化完全由您决定。
恕我直言,我会采用您将所有 Operation
相关行为、数据属性和不变量包含在 Operation
实体中的方法。 Order
负责保护其边界内的数据,但它不需要拥有做所有事情的 methods/logic。
您也可以在 Operation
实体中创建状态更改方法,就像您在 Order
聚合中所做的那样,但是从订单对象中调用它们。