Validation 网络:如何使用聚合根对其建模?

Validation 网络:如何使用聚合根对其建模?,validation,transactions,domain-driven-design,aggregateroot,Validation,Transactions,Domain Driven Design,Aggregateroot,域模型定义了A.o.实体之间的关系,我们定义了聚合根以提供封装和事务边界。众所周知的关系是一对一关系(聚合根中包含实体或值对象)、一对多关系(聚合根包含子对象的集合)和多对多关系。后者是困难的,因为聚合根之间的多对多关系会给事务边界带来麻烦。因此,在许多情况下,多对多关系的一个方向被视为更重要,只有该关系被建模为一对多关系。 现在,更进一步网络。同等合作伙伴之间的多对多关系如何在不违反聚合根上的事务边界的情况下对此进行建模? 看看这个广泛应用的例子: 我有一个带有节点的网络。每个节点都有数量有限

域模型定义了A.o.实体之间的关系,我们定义了聚合根以提供封装和事务边界。众所周知的关系是一对一关系(聚合根中包含实体或值对象)、一对多关系(聚合根包含子对象的集合)和多对多关系。后者是困难的,因为聚合根之间的多对多关系会给事务边界带来麻烦。因此,在许多情况下,多对多关系的一个方向被视为更重要,只有该关系被建模为一对多关系。
现在,更进一步网络。同等合作伙伴之间的多对多关系如何在不违反聚合根上的事务边界的情况下对此进行建模?
看看这个广泛应用的例子:
我有一个带有节点的网络。每个节点都有数量有限的端口。一个端口只能连接到另一个节点上的一个端口。我必须能够使用端口添加和删除节点之间的连接。
一种直观的方法是将节点建模为包含端口的聚合根。连接似乎是值对象,一个端口可以有一个连接。我可以实现一个Node.ConnectTo(nodeId,portId)方法,该方法将连接(节点a上的端口X和节点B上的端口Y之间)添加到聚合根节点a。我最好调用此方法两次,一次在节点a上,一次在节点B上,并将其包装到事务中但是,这将违反事务边界,因此我决定只将其存储在节点A上。
要查看应用程序客户端节点B上的连接,需要一个单独的读取模型。但这没有问题,CQRS体系结构为我们提供了这些可能性。因此,添加、删除和查看连接不是问题。
当我想在将连接添加到端口之前验证端口是否仍然可用时,就会出现问题。遵守我们的事务边界的结果是(在写模型中),聚合根可能不知道端口已连接的事实,但可能存储在任何其他聚合根中。
当然,您可以信任客户端的验证,继续添加连接(如果添加到的节点没有问题),并依靠运行一致性检查的进程执行无效连接的补偿操作。但与围绕两个ConnectTo呼叫包装一个事务相比,这对我来说似乎是一件大事…
这让我想到,可能是我的聚合根选错了。我开始将节点和网络视为聚合根,其中网络是连接的集合。网络聚合的好处是,您可以始终验证添加或删除连接。除非新连接会导致两个现有网络连接。。。您的聚合可能会变得很大,可能只会产生一个巨大的网络。也不可行。
那么,你认为这应该如何建模您是否看到一种将聚合根作为交易边界的解决方案,您可以验证您的网络,并且您不会冒险将整个网络存储为一个聚合?或者我是在这里要求所有3个CAP,这是完全不可能的吗?

好,我想这是一个“正确”的方法:

  • 在节点A上执行ConnectTo方法之前,使用最终一致的视图模型作为数据源(而不是无法有效验证的域模型,请参见上文),验证节点B上的端口是否仍然可用
  • ConnectTo仅在节点A上运行,因此不违反任何事务边界
  • 如果视图模型无法连接节点B上的端口,因为它已在使用中,则会发生真正的并发异常,必须向其发出信号。需要采取一些行动(曼努埃尔干预或自动化流程必须采取行动)。此并发异常的概率通常非常低
  • 我认为你的“新方法”是有缺陷的,因为视图模型不应该产生一个异常,它会“以某种方式”传播回域模型。域模型需要自己解决这个问题

    因此,在这种情况下(绑定1对1),您可以利用域模型中的事件,以便

  • NodeA.connect(“端口1”)至(“端口3”)上的(节点B)

  • NodeA保留自己的“端口1”

  • NodeA向NodeB发送“portConnectionRequest”

  • NodeB绑定“端口3”(如果可用)

  • NodeB发送“PortConnectionConfiged”或“PortConnectionDeed”

  • NodeA接收事件并相应地采取行动


  • 以上假设了可靠的消息传递,这在JVM中很容易实现,但在分布式环境中要困难得多,但这正是您更想要的。如果无法提供可靠的消息传递系统,我认为您将面临一个问题或其中的一部分。

    您需要使您的问题更具可读性。请查看并使用级别格式帮助我们阅读和理解您的问题。您关于交易边界的推理似乎有点人为。。。最好看看系统中的角色,谁将同时操作网络和节点,以及每个角色需要反馈的速度有多快(也许可以离线和按顺序验证整个过程),或者切换到更面向保留的系统(例如,在一段时间和某个操作中锁定节点)。别忘了和领域专家谈谈。是的,伊夫,你是对的。这里写的讨论是非常人为的。它从关系(一对多、多对多)开始,而不是从一致性边界开始。阿格里加