dee*_* zg 2 domain-driven-design
因此,如果集合体中存在实体,那么什么是阻止外部世界执行类似操作的最佳/通常方法Aggregate.Entity.SomeMethod()?(如果实体上存在吸气剂)
应该汇总暴露实体,还是应该让其获取器始终给出实体的值对象表示形式?(实际上是打破直接参考的副本)
或者,另一方面,实体应该是贫血的,其所有方法都移到集合中吗?
聚合不应以允许从外部更改聚合内部状态的方式公开数据。
这意味着聚合根对象不应分发对内部实体的引用。如果要更改聚合的状态,则向根实体发送一条消息,然后该逻辑决定是自己完成工作还是委托工作。
根对象的查询应返回值。
贫乏的实体没有太多意义-如果您走这条路,那么最好使用值对象使事情变得简单。
谢谢您的回答!您能否用以下方式扩展答案:1)这是否意味着聚合应该将实体的副本暴露给外部世界,以便其内部实体从外部不可变?或者它如何暴露它?2)wat是指“查询根对象应返回值”吗?
简短的答案:您根本不应在集合之外公开“实体”。
实体的动机是它们改变状态。聚集的动机是它们协调实体之间的状态变化。如果您从聚合中泄漏实体,则聚合将不再具有协调所有更改的能力。
因此:如果要更改总计,请“告诉,不要问”。您将信息传递给聚合根,它将反过来在根中创建/修改适当的实体。
如果您不想更改汇总,请使用返回不可变表示查询答案的查询。不变表示的确切性质可能因语言而异;在原始的域驱动设计文本中,示例取自Java,其中使用“值对象”实现了不可变的表示形式。参见蓝皮书的第五章。