2013-12-16 166 views
2

我已经分配了一个相当简单的项目作为考试,我有想法使用域驱动设计开发它。聚合和聚合根困惑

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

该应用程序是一个“机票”系统,从下面的图像,你可能很可能猜测它的功能。

事情是,我不知道我是否正确地分离聚合和他们的根。

enter image description here

编辑: 我给出的数据模型,使任何人都可以很容易地发现整个功能。

问题是,从雇员的角度来看,“Rad”表示封装了整个功能并且是聚合根。

但是从管理角度来看,航班没有他的业务。 他只是想更新或添加新的飞机 - 公司等。

因此,然后有一个新的聚合根,这是飞机封装飞机座位(实体),seatType(价值对象)和公司(实体)作为新聚合。

  1. 这往往混淆我,因为我有一个聚合根(飞机)在另一个聚合(飞行聚合)内。
  2. 由于聚合根被认为是没有它的“CORE”实体,其中的其他实体在没有它的情况下没有任何意义,所以我在考虑公司。而我的结论是,公司没有飞机是有道理的。

为了更多地解释管理员想要插入新公司或想先载入公司然后载入其飞机的场景。

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

回答

0

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

聚合是聚集在一起的项目集合(域对象),聚合根是实体根...(如果您考虑飞行聚合封装座位,位置...聚合根应该是飞行实体)。

[编辑]

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

+0

我已经更新了问题,而不是在这里发布评论,因为它是该死的大。 – BeStelios

0

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

聚合根是聚集中的唯一对象,它允许访问聚合中的其他类型,因此每个聚合将有一个存储,并返回聚合根类型的实例。