我没有 Eric Evans' Domain-driven design book ,但基本上说
外部对象可能不包含对实体的引用 聚合内部。外部对象必须引用 仅聚合根,没有内部对象。
例如,我的Team
聚合根有一个名为AddPlayer()
的方法,并返回添加的Player
实体。这是否意味着我违反了规则,还是说我无法凭空掏空Player
实体,例如将其从汇总边界以外的存储库中拉出来?
答案 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只是一个包含的实体,这可能会让你感到痛苦。在现实生活中,玩家不需要属于团队,也取决于你的“团队”是什么。它只是集体名称,当前成员,或者某一天可以带到现场的实际人员吗?
所以你最终会得到不同的'团队':
因此,玩家不一定是聚合的部分,而是聚合可以拥有某种所有权,可能是对玩家的一个相当弱的引用(例如只有ID或某个值对象) 。这样的效果。
但要回到Eric在他的书中提到的内容:我认为它与这样的事情有关(使用你的模具):
var line = Order.AddLine(SomeProduct);
在这里,对聚合中的实际实体的引用不应该太多意义,因为它没有自己的生命周期。那么,在这种情况下,订单行甚至不是实体。
还有一些关于存储库是否仅返回AR或实体(在某些存储库中是AR)的讨论。根据我找到蓝皮书,您可以从存储库中检索实体。
反正。只是一些想法。 HTH:)
答案 1 :(得分:0)
我认为你正在阅读Eric Evan的指导。我不相信他说你不能让球员从球队中暴露出来。相反,我读了像Eben这样的规则。如果玩家在团队的上下文之外没有任何意义,那么你不会想要传递一个玩家,特别是如果“外部对象”没有与团队的概念或关系。自从我看了那本书以来已经很长时间了。您确定这不适用于系统集成边界吗?我无法想象埃里克说你不能在你的系统内传递一个玩家。