【问题标题】:Domain Driven Design Aggregate Referencing Question领域驱动设计聚合参考问题
【发布时间】:2011-11-04 11:55:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# domain-driven-design dns


    【解决方案1】:

    我认为您对 Eric Evan 的指导读得太多了。我不相信他是说你不能从团队中暴露球员。相反,我像 Eben 一样阅读规则。如果 Player 在 Team 上下文之外没有任何意义,那么您就不会希望绕过 Player,特别是如果“外部对象”与 Team 没有概念或关系时。很久没有看那本书了。您确定这不适用于系统集成边界吗?我无法想象 Eric 是在说你不能在你的系统内传球。

    【讨论】:

      【解决方案2】:

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

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

      你有一个Team,你有一个Player。那将是 2 个聚合根。让 Team 成为 Aggregate Root 和 Player 只是一个包含的实体,这可能会让你感到痛苦。在现实生活中,一名球员不必属于一个球队,这也取决于你的“球队”是什么。仅仅是集体名称,还是当前成员,或在特定日期可以参加该领域的实际人员?

      所以你最终可能会得到不同的“团队”:

      • 团队
      • 小队
      • GameSquad

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

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

      var line = Order.AddLine(SomeProduct);

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

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

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

      【讨论】:

      • 实际上,它是为了打高尔夫,所以我的真实实体是四人组,而没有其父四人组,球员和球员就不存在。这有帮助吗?
      • 假设我需要从我的应用程序层对每个玩家做一些事情,对于玩家集合,订单返回给我什么?
      • Order 是订单处理有界上下文中的一个示例。至于打高尔夫球:我仍然会有一个球员。该玩家可能参与许多Tournaments 和许多Foursomes。例如,您可以在球员管理 BC 中使用Player,在锦标赛 BC 中使用Player,您可以将球员添加到四人组中。或者您可以为Foursome 设置一个AssignedPlayer。但这一切都取决于您的域。
      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多