Domain driven design 外部对象是否应该通过调用…,对内部实体执行操作。。。?

Domain driven design 外部对象是否应该通过调用…,对内部实体执行操作。。。?,domain-driven-design,Domain Driven Design,一, 聚合中的实体只能通过聚合根访问。虽然根目录可以在单个操作期间将对内部实体的瞬时引用传递给外部对象,但我假设在大多数情况下,如果外部对象需要对内部实体执行某些操作,它应该调用在聚合根目录中定义的示例-Order.SetOrderLineTitle 2只能直接获得聚合根。必须通过遍历关联找到所有其他对象 a当我们说外部对象应该通过遍历关联来访问非根实体时,我们是说它们应该调用聚合根上的方法,例如Order.SetOrderLineTitle。。。,这反过来又会对内部对象执行操作,还是说聚合根应

一, 聚合中的实体只能通过聚合根访问。虽然根目录可以在单个操作期间将对内部实体的瞬时引用传递给外部对象,但我假设在大多数情况下,如果外部对象需要对内部实体执行某些操作,它应该调用在聚合根目录中定义的示例-Order.SetOrderLineTitle

2只能直接获得聚合根。必须通过遍历关联找到所有其他对象

a当我们说外部对象应该通过遍历关联来访问非根实体时,我们是说它们应该调用聚合根上的方法,例如Order.SetOrderLineTitle。。。,这反过来又会对内部对象执行操作,还是说聚合根应该将对内部实体的引用传递给外部对象,或者两者都传递


谢谢

1是的,这是聚合保持其完整性的最佳方式。有人说,这可能会导致使用大量方法的聚合,但在这种情况下,可能会有多个聚合在起作用


2理想情况下,聚合将在不传递引用的情况下执行所需的操作。在某些情况下,传递引用可能是有意义的,但应谨慎执行,因为这会使完整性推理变得更加困难。

1是的,这是聚合保持其完整性的最佳方式。有人说,这可能会导致使用大量方法的聚合,但在这种情况下,可能会有多个聚合在起作用

2理想情况下,聚合将在不传递引用的情况下执行所需的操作。在某些情况下,传递引用是有意义的,但在实现时应小心,因为这会使关于完整性的推理更加困难

我假设在大多数情况下,如果外部对象需要执行一些 对内部实体的操作,它应该调用在 聚合根

为了增加一个稍微不同的理解,也可以使用相反的方法。在大多数情况下,向聚合根添加方法会迫使您将域划分为非常小的聚合,以免根变得臃肿,从而违反SRP。这种分割可能以牺牲聚合的自然业务凝聚力为代价


相反,您可以决定,在大多数情况下,您将允许外部对象获得对内部实体的瞬态引用,并根据需要对其进行操作。在较少见的情况下,尤其是那些意味着强制执行跨多个实体的不变量的情况下,最好直接在根上实现这些操作

这里讨论了这种方法:

在我看来,虽然聚合根负责 内部实体的生命周期,这并不意味着它应该是 独占接口,而不是将特定实体返回给所有 对聚合中的任何项调用的方法

总的来说,最终的决定将取决于您是想在设计聚合时主要考虑域/功能的内聚性,还是首先想将其视为事务性保护措施

我假设在大多数情况下,如果外部对象需要执行一些 对内部实体的操作,它应该调用在 聚合根

为了增加一个稍微不同的理解,也可以使用相反的方法。在大多数情况下,向聚合根添加方法会迫使您将域划分为非常小的聚合,以免根变得臃肿,从而违反SRP。这种分割可能以牺牲聚合的自然业务凝聚力为代价


相反,您可以决定,在大多数情况下,您将允许外部对象获得对内部实体的瞬态引用,并根据需要对其进行操作。在较少见的情况下,尤其是那些意味着强制执行跨多个实体的不变量的情况下,最好直接在根上实现这些操作

这里讨论了这种方法:

在我看来,虽然聚合根负责 内部实体的生命周期,这并不意味着它应该是 独占接口,而不是将特定实体返回给所有 对聚合中的任何项调用的方法


总的来说,最终决定将取决于您是想主要考虑域/功能的内聚性来设计聚合,还是首先想将其视为事务性保护措施。

1是,这是我假设只有其他替代方法可以传递对内部实体的引用,或者不允许外部对象对内部实体执行操作的最佳方法?2理想情况下,聚合将在不传递引用的情况下执行所需的操作。我们使用的术语是遍历吗
两种情况下的关联?两种情况下都是。遍历实际上是一系列引用。在这两种情况下都是。遍历实际上是一个引用序列,但如果我们挑剔,在使用这种方法->Order.SetOrderLineTitle。。。?无论如何,感谢您的帮助1是的,这是最好的方式,我假设只有其他选择是传递对内部实体的引用,还是不允许外部对象对内部实体执行操作?2理想情况下,聚合将在不传递引用的情况下执行所需的操作。我们在这两种情况下都使用关联遍历这个术语吗?在这两种情况下都使用。遍历实际上是一系列引用。在这两种情况下都是。遍历实际上是一个引用序列,但如果我们挑剔,在使用这种方法->Order.SetOrderLineTitle。。。?无论如何,感谢您在罕见的情况下提供的帮助,特别是那些意味着强制执行跨多个实体的不变量的情况。。。我认为这种情况很常见?可能是,我想这取决于你的领域。尽管如此,除了根之外的所有实体都是贫血的这一点是很常见的。贫血的实体是一个只有数据而没有行为的实体,不管其合法行为被错放在哪里。仅仅是因为根对它们强制执行了一些不变量=>在我的经验中,不变量基本上适用于每次执行可能改变实体的操作。这使得它成为你的绝大多数业务。我不计算读取操作,它们大部分时间只是数据访问,而不是少量的计算/算法。我不认为它们在我推荐的方法中是贫血的,但是在您的方法中;如果外部对象需要对内部实体执行某些操作,它应该调用在聚合根==贫血实体上定义的方法。在较少见的情况下,尤其是那些意味着强制执行跨多个实体的不变量的方法。。。我认为这种情况很常见?可能是,我想这取决于你的领域。尽管如此,除了根之外的所有实体都是贫血的这一点是很常见的。贫血的实体是一个只有数据而没有行为的实体,不管其合法行为被错放在哪里。仅仅是因为根对它们强制执行了一些不变量=>在我的经验中,不变量基本上适用于每次执行可能改变实体的操作。这使得它成为你的绝大多数业务。我不计算读取操作,它们大部分时间只是数据访问,而不是少量的计算/算法。我不认为它们在我推荐的方法中是贫血的,但是在您的方法中;如果外部对象需要对内部实体执行某些操作,它应该调用在聚合根==贫血实体上定义的方法