域驱动设计聚合引用问题

时间:2011-08-26 12:23:48

标签: c# domain-driven-design dns

我没有 Eric Evans' Domain-driven design book ,但基本上说

  

外部对象可能不包含对实体的引用   聚合内部。外部对象必须引用   仅聚合根,没有内部对象。

例如,我的Team聚合根有一个名为AddPlayer()的方法,并返回添加的Player实体。这是否意味着我违反了规则,还是说我无法凭空掏空Player实体,例如将其从汇总边界以外的存储库中拉出来?

2 个答案:

答案 0 :(得分:4)

这一直是一个棘手的问题,很可能表明您的设计不适合您的域名。我在我的博客上有一点要说的(如果你感兴趣的话):

http://www.ebenroux.co.za/post/2010/08/20/Natrual-Aggregates-vs-Synthetic-Aggregates.aspx

您有一个Team并且您有一个Player。这将是2 Aggregate Roots。使Team成为Aggregate Root,Player只是一个包含的实体,这可能会让你感到痛苦。在现实生活中,玩家不需要属于团队,也取决于你的“团队”是什么。它只是集体名称,当前成员,或者某一天可以带到现场的实际人员吗?

所以你最终会得到不同的'团队':

  • GameSquad

因此,玩家不一定是聚合的部分,而是聚合可以拥有某种所有权,可能是对玩家的一个相当弱的引用(例如只有ID或某个值对象) 。这样的效果。

但要回到Eric在他的书中提到的内容:我认为它与这样的事情有关(使用你的模具):

var line = Order.AddLine(SomeProduct);

在这里,对聚合中的实际实体的引用不应该太多意义,因为它没有自己的生命周期。那么,在这种情况下,订单行甚至不是实体。

还有一些关于存储库是否仅返回AR或实体(在某些存储库中是AR)的讨论。根据找到蓝皮书,您可以从存储库中检索实体。

反正。只是一些想法。 HTH:)

答案 1 :(得分:0)

我认为你正在阅读Eric Evan的指导。我不相信他说你不能让球员从球队中暴露出来。相反,我读了像Eben这样的规则。如果玩家在团队的上下文之外没有任何意义,那么你不会想要传递一个玩家,特别是如果“外部对象”没有与团队的概念或关系。自从我看了那本书以来已经很长时间了。您确定这不适用于系统集成边界吗?我无法想象埃里克说你不能在你的系统内传递一个玩家。