实体应该有方法吗,如果有的话如何防止它们在集合外部被调用

dee*_* zg 2 domain-driven-design

因此,如果集合体中存在实体,那么什么是阻止外部世界执行类似操作的最佳/通常方法Aggregate.Entity.SomeMethod()?(如果实体上存在吸气剂)

应该汇总暴露实体,还是应该让其获取器始终给出实体的值对象表示形式?(实际上是打破直接参考的副本)

或者,另一方面,实体应该是贫血的,其所有方法都移到集合中吗?

Voi*_*son 6

聚合不应以允许从外部更改聚合内部状态的方式公开数据。

这意味着聚合根对象不应分发对内部实体的引用。如果要更改聚合的状态,则向根实体发送一条消息,然后该逻辑决定是自己完成工作还是委托工作。

根对象的查询应返回值。

贫乏的实体没有太多意义-如果您走这条路,那么最好使用值对象使事情变得简单。

谢谢您的回答!您能否用以下方式扩展答案:1)这是否意味着聚合应该将实体的副本暴露给外部世界,以便其内部实体从外部不可变?或者它如何暴露它?2)wat是指“查询根对象应返回值”吗?

简短的答案:您根本不应在集合之外公开“实体”。

实体的动机是它们改变状态。聚集的动机是它们协调实体之间的状态变化。如果您从聚合中泄漏实体,则聚合将不再具有协调所有更改的能力。

因此:如果要更改总计,请“告诉,不要问”。您将信息传递给聚合根,它将反过来在根中创建/修改适当的实体。

如果您不想更改汇总,请使用返回不可变表示查询答案的查询。不变表示的确切性质可能因语言而异;在原始的域驱动设计文本中,示例取自Java,其中使用“值对象”实现了不可变的表示形式。参见蓝皮书的第五章。