【问题标题】:Transitioning a referenced aggregate root to another aggregate root将引用的聚合根转换为另一个聚合根
【发布时间】:2016-03-26 15:15:01
【问题描述】:

我的系统使用“联系人”的语言,这是一种“幽灵用户”,我们有一些信息 - 它的验证规则很窄,它的状态主要是联系信息。我们还有一个“用户”的概念,它是经过全面审查和注册的用户。将“用户”视为充实的“联系人”。

我们试图捕捉的生命周期是,一旦有人使用“联系人”的信息注册,“联系人”将被“用户”替换。

我们在系统中有其他聚合根引用指向“Contact”的 UUID 的“ContactId”。当“联系人”注册时,我们想使用“用户”的新概念在域中表示他们,“用户”现在拥有自己的“用户 ID”UUID。

  1. 我们如何将仍然通过 ContactID 引用“Contact”的关系保留为现在通过 UserID 引用“User”?
  2. 尝试将我的聚合转换为另一个聚合是否存在根本问题?
  3. 如果是这样,我应该如何为“联系人”->“注册用户”的这个特定生命周期建模?
  4. 如果答案是将这两个想法合并到一个聚合根中,我如何才能让我的域对象始终有效,尽管在此“联系人”实际注册之前“用户”无效?

附带说明一下,我们将 CQRS/ES 用于整体架构。

谢谢!

【问题讨论】:

  • 我会继续使用联系人,可能会为它找到另一个名称。当用户注册时,它将获得到 Authentication 子域的适当链接。对于其他聚合/BC,如果这是潜在客户或实际用户,可能只是部分有趣,但如果他们想知道,您始终可以将此信息包含在您保留联系人引用的值对象中,以及名称,例如
  • 我使用术语Applicant 来表示尚未在我的一个项目中完全注册的用户。您也可以使用销售术语Lead
  • @ChrisTickner 为什么需要将Contact 关系转换为User 关系?为什么推荐实体会关心?你有一个用例的例子吗?

标签: domain-driven-design cqrs domain-events


【解决方案1】:

你所描述的其实并不奇怪,因为它一直在发生。

您可以将ShoppingCart 变成Quote,再将Order 变成Invoice

试图合并概念通常会导致痛苦和折磨。

我建议将它们分开并用它们自己的生命周期处理它们,因为它们可能看起来非常密切相关,因为它们确实确实看起来是彼此不同的概念.

您的“幽灵用户”可能有线索。那可能是您未正确定义的实体/ AR。将有不同的方式来处理这个概念,这取决于它是如何被使用的。它可能就像表示两个源实体中的一个值对象一样简单。

【讨论】:

  • 谢谢。使用封装两者的单个 AR 是否有意义?例如,具有“联系人”数据的值对象的“身份”AR,如果用户已注册,还具有“用户”实体?或者,这是否在一个“想法”中添加了太多?请记住,我主要关心的是其他 AR 存储对此 AR 的 UUID 引用。
  • 这取决于您的域。你的提议听起来并不牵强。例如,OrderLine 可能有一个OrderProduct VO,其中它具有已订购的Product 的 ID。但是,如果我们通常不储存特定物品会发生什么?例如,当我在自行车店出售二手自行车时,就没有ProductId;而只是DescriptionPrice。也许这些方面的东西会有所帮助。您的领域专家应该能够在这里提供帮助。
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2013-07-10
  • 2015-01-04
  • 1970-01-01
  • 2019-02-13
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多