如何检查将子 DDD 实体添加到父(树状结构)实体是否在另一个树中不做循环



我正在建模一个域,其中实体是业务服务的包装,可以由其他软件包制成 - 树结构。我在设计域逻辑以避免周期时有一些问题。

假设我们有packagea的实体(类"软件包"的对象(,并且有孩子(packageb and packagec(。我们还包装了子包装。现在,我们希望将Packagea添加到PackageB为孩子的孩子 - 我们是通过从Packagere -Postiory获取包裹并使用PackageB :: AddChildPackage((方法来做到这一点。但是在此之前,我们需要确保添加此软件包不会在其他树中执行任何循环(在示例中(。问题是如何在DDD中实施它?

我考虑过将添加软件包移动到域服务,因此我可以获取与我要修改的软件包相关的所有软件包,并在没有周期的情况下检查它们。

您认为这是个好主意吗?

我考虑过将添加软件包移动到域服务,因此我可以获取与我要修改的软件包相关的所有软件包,并在没有周期的情况下检查它们。

您认为这是个好主意吗?

是的,您可以做到。添加PackageServices类,该类提供验证Package的验证,对于您对域的描述有意义。

骨料根不应包含对另一个聚合根实例的引用。您应该使用Id或包含Id和一些额外有趣信息的值对象间接引用另一个聚合。

您的情况似乎符合分类结构的线条,您可以将事件模型与主聚集体分开。无论哪种方式,您都需要获得整个层次结构,即您的汇总属于没有周期的检查。但是,不能保证您和其他用户所做的工作会创建一个周期。

或多或少也是如此的唯一属性,例如电子邮件地址。在这种情况下,它可能就像在数据存储中创建唯一约束一样简单。

在循环依赖性的情况下,它不会像创建约束一样简单,而对于不支持唯一约束的数据存储也是如此。

在这种情况下,您需要使用一些A Process Manager 并执行几个步骤。我们可能希望通过在层次结构中创建项目之前检查一个周期来防止明显的周期。完成工作单位(例如交易(后,您可以发送一条消息以验证新条目。然后,第二步将再次检查一个周期,因为其他人可能与您一起创建了一个无效的状态。如果您有一个周期,则最后输入的项目"丢失",并删除了为了使该决定已知的已发布的各种通知。

另一种方法是尝试使用某种锁定策略来防止创建周期。根据您的设计,这必须具有正确的谷物。如果您有各种独立的层次结构,则可以将它们锁定在根级别上。根将是没有父母的Package。提交后,您将发布锁定。如果您有一个层次结构,那么您可能仍然可以锁定它,并且一次只允许对层次结构进行一次更改。

使用域服务似乎是这样做的方法,但这本身并不能完全解决您的问题。

更多地是关于该服务将要做什么的

最新更新