2011-08-26 80 views
3

我不会对我的Eric Evans' Domain-driven design book,但它说基本上领域驱动设计总引用问题

外部对象可能不会坚持就是 内部聚集的实体的引用。外部对象必须仅引用 聚合根,不包含内部对象。

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

回答

4

这总是一个棘手的问题,很可能表明您的设计不太适合您的域名。我有一点要说一下这个在我的博客(你应该关注):

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

你有Team和你有一个Player。那将是2根总根。让团队成为聚合根和玩家只是一个被包含的实体,这可能会导致你痛苦。在现实生活中,一名球员不需要属于一支球队,这也取决于你的球队是什么。它只是一个集体名称,或者是现有的成员,或者是某一天可以带到现场的实际人员?

所以,你最终可能会与不同的 '团队':

  • GameSquad

让球员不一定部分骨料但相反,聚合可以具有某种所有权,可能对玩家的引用很弱(例如只有一个ID或某个值对象)。对此有所影响。

但要回什么埃里克指的是在他的书:我认为这涉及到这样的事情(使用模具):

VAR线= Order.AddLine(SomeProduct);

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

关于是否只有存储库返回AR或实体(在某些存储库中是AR),也有一些讨论。根据什么已经找到了蓝皮书你可以从存储库中检索一个实体。

无论如何。只是一些想法。 HTH :)

+0

事实上,这是一个高尔夫郊游,所以我真正的实体是一个四人组和玩家,玩家不存在没有其父母四人组。这有帮助吗? – Marco

+0

因此,我们可以说我需要从应用程序层对每个玩家做些什么,该命令返回给我的玩家集合是什么? – Marco

+0

'订单'是来自订单处理有界上下文的示例。至于高尔夫:我仍然会有一名球员。该玩家可能参与许多“锦标赛”和许多“四人组”。例如,您可以在球员管理BC中拥有一名“球员”,并在锦标赛BC中拥有一名“球员”,您可以将球员添加到四人组中。或者你可以为'Foursome'设置一个'AssignedPlayer'。但这一切都取决于你的域名。 –

0

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