ddd之聚合

聚合是一个用来定义对象所有权和边界的领域模式。

来自模型的 挑战是通常不让它们尽量完整,而是让它们尽量地简单和容易理解

关联的数字应该被尽可能消减。首先,要删除模型中非本质的关联关系。它们可能在领域
中是存在的,但它们在我们的模型中不是必要的,所以我们要清除它们。其次,可以通过增加约束的方式来消减多重性。如果很多对象满足一种关系,那么在这个关系上加入正确的约束后,很有可能只有一个对象会继续满足这种关系。第三,很多时候双向关联可以被转换成非双向的关联。

不变量是在数据发生变化时必须维护的那些规则。这在许多对象与数据发生变化的对象保持引用时更难实现。

聚合是针对数据变化可以考虑成一个单元的一组相关的对象。聚合使用边界将内部和外部的对象划分开来。每个聚合有一个根。这个根是一个实体,并且它是外部可以访问的唯一的对象。根可以保持对任意聚合对象的引用,并且其他的对象可以持有任意其他的对象,但一个外部对象只能持有根对象的引用。如果边界内有其他的实体,那些实体的标识符是本地化的,只在聚合内有意义。

聚合是如何 保持数据一致性和强化不变量的呢?因为其他对象只能持有根对象的引用,这意味着它们不能直接变更聚合内的其他的对象。它们所能做的就是对根进行变更,或者让根来执行某些活动。根能够变更其他的对象,但这是聚合内包含的操作,并且它是可控的。如果根从内存中被删除或者移除,聚合内的其他所有的对象也将被删除,因为再不会有其他的对象持有它们当中的任何一个了。当针对根对象的修改间接影响到聚合内的其他的对象,强化不变量变得简单了,因为根将做这件事情。如果外部对象能直接访问内部对象并且变更它们时,这将变得越发困难。在这种情况下想强化不变量意味着讲某些逻辑放到外部对象中去处理,这不是我们所期望的。

根对象可能将内部的临时引用传递给外部对象,作为限制,当操作完成后,外部对象不能再持有这个引用。一个简单的实现方式是向外部对象传递一个值对象的拷贝。在这个对象上发生了什么将不再重要,因为它不会以任何方式影响到聚合的一致性。

如果聚合对象被保存到数据库中,只有根可以通过查询来获得。其他的对象只能通过导航关联来获得。

聚合内的对象可以被允许持有对其他聚合的根的引用。

根实体拥有全局的标识符,并且有责任管理不变量。内部的实体拥有内部的标识符。

猜你喜欢

转载自huyumin.iteye.com/blog/1742327
ddd