领域驱动设计聚合引用问题
本文关键字:引用 问题 | 更新日期: 2023-09-27 18:06:56
我没有Eric Evans的领域驱动设计书,但它基本上说
外部对象不能包含对实体的引用在聚合内部。外部对象必须引用只聚合根,不聚合内部对象。
例如,我的Team
聚合根有一个名为AddPlayer()
的方法,并返回添加的Player
实体。这是否意味着我违反了规则,还是说我不能凭空拉出Player
实体,例如,从其聚合边界之外的存储库中拉出它?
这总是一个棘手的问题,很可能表明你的设计不太适合你的领域。关于这一点,我在我的博客上有一点要说(如果你感兴趣的话):
http://www.ebenroux.co.za/post/2010/08/20/Natrual-Aggregates-vs-Synthetic-Aggregates.aspx有一个Team
和一个Player
。也就是2个聚合根。让团队成为聚合根和玩家只是一个包含的实体,这可能会让你感到痛苦。在现实生活中,玩家不一定属于某个团队,这还取决于你的"团队"是什么。仅仅是集体的名字,或者是现在的成员,或者是在某一天能够上场的人?
所以你最终可能会有不同的"团队":
- 团队球队
- GameSquad
所以玩家不一定是聚合的部分,而是聚合可以具有某种所有权,可能是对玩家的一个相当弱的引用(例如只有一个ID或一些值对象)。大概是这个意思。
但是回到Eric在他的书中提到的:我认为它与这样的东西有关(使用你的模具):
var line = Order.AddLine(SomeProduct);
在这里,对聚合中的实际实体的引用没有太大意义,因为它没有自己的生命周期。嗯,在这种情况下,订单行甚至不是一个实体。
关于存储库是否只返回ar或实体(在某些存储库中是ar)也有一些讨论。根据我找到的蓝皮书,您可以从存储库中检索实体。
。只是一些想法。HTH:)
我认为你对Eric Evan的指导读得太多了。我不相信他是说你不能从团队中揭露玩家。相反,我像埃本一样解读规则。如果玩家在团队上下文之外没有任何意义,那么你就不会想要传递玩家,特别是当"外部对象"与团队没有概念或关系时。我已经很久没看那本书了。您确定这不适用于系统集成边界吗?我无法想象Eric会说你不能在你的系统中传球一个球员。