Domain driven design 将引用的聚合根转换为另一个聚合根

Domain driven design 将引用的聚合根转换为另一个聚合根,domain-driven-design,cqrs,domain-events,Domain Driven Design,Cqrs,Domain Events,我的系统有一种“联系人”的语言,这是一种我们有一些信息的“幽灵用户”——它的验证规则很小,它的状态主要是联系人信息。我们还有一个“用户”的概念,即经过充分审查和注册的用户。把“用户”想象成一个充实的“联系人” 我们试图捕获的生命周期是,一旦有人使用“联系人”的信息注册,“联系人”将被“用户”取代 我们在系统中还有其他聚合根,它们引用指向“联系人”UUID的“联系人ID”。当“联系人”注册时,我们希望使用“用户”的新概念在域中表示他们,“用户”现在有自己的“UserID”UUID 我们如何保持仍然

我的系统有一种“联系人”的语言,这是一种我们有一些信息的“幽灵用户”——它的验证规则很小,它的状态主要是联系人信息。我们还有一个“用户”的概念,即经过充分审查和注册的用户。把“用户”想象成一个充实的“联系人”

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

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

  • 我们如何保持仍然通过ContactID引用“联系人”的关系,现在通过UserID引用“用户”
  • 尝试将我的聚合转换为另一个聚合是否存在根本问题
  • 如果是这样,我应该如何为“联系人”->“注册用户”的这个特定生命周期建模
  • 如果答案是将这两个概念合并到一个聚合根中,那么我如何保持我的域对象始终有效,尽管“用户”在该“联系人”实际注册之前无效
  • 作为旁注,我们在总体架构中使用CQRS/ES


    谢谢

    你所描述的其实并不奇怪,因为它总是发生

    您可以拥有一个
    购物车
    ,它可以成为
    报价
    ,它可以成为
    订单
    ,它可以成为
    发票

    试图融合概念通常会导致痛苦和痛苦

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


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

    我会继续使用联系人,可能会为它找到另一个名称。当用户注册时,它将获得到身份验证子域的适当链接。对于其他聚合/BC,如果这是潜在用户或实际用户,则可能只是部分有趣,但如果他们想知道,您可以始终将此信息包括在保留联系人引用的值对象中,以及名称,例如,我使用术语“申请者”来表示尚未在我的一个项目中完全注册的用户。您也可以使用销售术语Lead。@ChrisTickner为什么需要将
    联系人
    关系转换为
    用户
    关系?为什么转介实体会在意?你有这样一个用例的例子吗?谢谢。使用一个封装两者的AR有意义吗?例如,“身份”AR具有“联系人”数据的值对象,如果用户已注册,还具有“用户”实体?或者,这是否给一个“想法”增加了太多内容?记住,这里我主要关心的是其他AR存储对此AR的UUID引用。这取决于您的域。你的提议听起来并不太牵强。例如,
    OrderLine
    可以有一个
    OrderProduct
    VO,其中它具有已订购的
    产品的Id。但是,如果我们通常不储存特定的商品,会发生什么呢?例如,当我在自行车店销售二手自行车时,将没有
    ProductId
    ;而不仅仅是
    说明
    价格
    。也许沿着这些思路做点什么会有所帮助。您的领域专家应该能够在此提供帮助。