那么,如果一个集合中有一个实体,那么防止外部世界做类似Aggregate.Entity.SomeMethod()的事情的最佳/通常方法是什么呢?(如果聚合上的实体有一个getter )
聚合应该公开实体,还是它的getter应该总是给出实体的值对象表示?(实际上是破坏直接引用的副本)
或者,另一方面,实体应该是贫血的,它的所有方法都是聚合的吗?
发布于 2018-08-18 10:22:44
聚合不应以允许从外部更改聚合的内部状态的方式公开数据。
这意味着聚合根对象不应该向内部实体传递引用。如果要更改聚合的状态,则向根实体发送一条消息,该逻辑决定是完成工作本身还是委托它。
根对象的查询应该返回值。
贫血的实体没有多大意义--如果你要走这条路,你最好用价值对象来保持简单。
谢谢你的回答!你能不能扩展一个答案: 1)这是否意味着聚合应该将实体的副本暴露给外部世界,从而使其内部实体从外部不可变?或者它是如何公开的? 2)您的意思是“根对象的查询应该返回值”吗?
简短的回答:你根本不应该在聚合之外暴露“实体”。
实体的动机是它们改变状态。聚合的动机是它们协调实体间状态的变化。如果将一个实体从聚合中泄漏出去,那么聚合就不再能够协调所有更改。
因此:如果你想改变一个集合,“告诉,不要问”。您将信息传递给聚合根,然后它将在根中创建/修改适当的实体。
如果不想更改聚合,则使用返回查询答案的不变表示的查询。这种不变表示的确切性质可能因语言而异;在原始领域驱动的设计文本中,示例取自Java,其中不变的表示是使用"value objects“实现的。见蓝皮书的第五章。
发布于 2018-08-25 20:58:28
这是一个能见度范围的问题。这将取决于您正在使用的编程语言。例如,在java中,我将一个聚合放在一个包中。聚合根实体将是公共的。其他将有包范围,即,没有关键字的可见度。
https://stackoverflow.com/questions/51907447
复制相似问题