代码之家  ›  专栏  ›  技术社区  ›  tlt

实体是否应该有方法,如果有,如何防止它们在聚合外部被调用

  •  1
  • tlt  · 技术社区  · 6 年前

    因此,如果在一个集合中有一个实体,那么防止外部世界做如下事情的最佳/常用方法是什么 Aggregate.Entity.SomeMethod() ? (如果聚合上有实体的getter)

    聚合公开实体到底是应该还是它的getter总是给出实体的值对象表示?(实际上是一个副本,用来打断直接引用)

    2 回复  |  直到 6 年前
        1
  •  6
  •   VoiceOfUnreason    5 年前

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

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

    根对象的查询应返回值。

    谢谢你的回答!你能不能把答案扩展为:1)这是否意味着聚合应该向外部世界公开实体的副本,以便其内部实体不受外部影响?或者它是如何暴露出来的?2) 你的意思是“根对象的查询应该返回值”?

    简而言之:你根本不应该把“实体”暴露在聚合之外。

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

    如果不想更改聚合,请使用返回查询答案的不可变表示形式的查询。这种不可变表示的精确性质可能因语言而异;在最初的领域驱动设计文本中,示例取自Java,在Java中,不可变表示是使用“值对象”实现的。见第五章 blue book .

        2
  •  1
  •   choquero70    6 年前

    这是一个可视范围的问题。这取决于您使用的编程语言。例如,在java中,我将一个聚合放在一个包中。聚合根实体将是公共的。其他的将有包范围,即,没有关键字的可见性。