聚合和聚合根源混乱

时间:2013-12-16 01:01:06

标签: domain-driven-design aggregate aggregateroot

我被分配了一个非常简单的项目作为考试,我有想法使用域驱动设计开发它。

你们中的许多人可能会说应用程序非常简单,因此使用存储库和UoW只是浪费时间,而你可能是正确的,但我认为这是一个学习更多东西的机会。

该应用程序是一个“机票”系统,从下图中你可能会猜到它的功能。

问题是我不确定我是否正确地分离了聚合物及其根源。

enter image description here

编辑: 我展示了数据模型,因此任何人都可以轻松发现整个功能。

事实是,从雇员的角度来看,作为“Rad”的航班表示封装整个功能并且是聚合根。

然而,从管理员的角度来看,航班不是他的商务。 他只想更新或添加新的飞机公司等。

然后有一个新的聚合根,即Airplane,它将飞机座位(实体),seatType(值对象)和公司(实体)封装为新聚合。

  1. 这会让我感到困惑,因为我在另一个聚合(Flight Aggregate)中有一个聚合根(Airplane)。
  2. 由于聚合根被认为是“核心”实体,没有它,其中的其他实体没有任何意义,我正在考虑公司。我得出的结论是,公司在没有飞机的情况下是有道理的。
  3. 为了解释更多,我想到了管理员想要插入新公司,或者想先加载公司然后再加载其飞机的情况。

    DDD原则说聚合内的任何实体只能从根本身加载。 所以这就是混乱。

2 个答案:

答案 0 :(得分:0)

嗯,这里的Aggregate和Aggregate根源在哪里?这只是数据模型...非域模型。

聚合是聚集在一起的项目集群(域对象),聚合根是实体根...(如果您认为Flight Aggregate封装了Seats,Location ... Aggregate Root应该是Flight实体)

[编辑]

你必须忽略持久性。在你的应用程序中,你可以有许多聚合它取决于你的域,也许Flight是一个Aggregate和Company另一个;),不要混淆实体和聚合......

答案 1 :(得分:0)

聚合是一组实体(具有标识的对象),也可能是值对象(没有标识的对象,不可变)。聚合中只有一个实体是聚合根。您可以通过检查聚合中的其他对象是否依赖于它来轻松识别它,例如,如果删除聚合根类型的对象,则其余对象不再有意义(在数据库术语中,您将级联删除依赖对象。)

聚合根是聚合中唯一可以访问聚合中其他类型的对象,因此每个聚合都有一个存储库,并返回聚合根类型的实例。