gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:20:32 28 4
gpt4 key购买 nike

那么,如果聚合中有实体,那么防止外部世界执行 Aggregate.Entity.SomeMethod() 之类的最佳/常用方法是什么? (以防聚合实体有 getter)

应该聚合暴露实体还是应该它的getter总是给出实体的值对象表示? (其实是为了打破直接引用的副本)

或者,另一方面,实体应该是贫血的,并且它的所有方法都应该转移到聚合?

最佳答案

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

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

根对象的查询应该返回值。

贫乏的实体没有多大意义——如果你要走这条路,你不妨用值对象保持简单。

thanks for you answer! could you just please extend an answer with: 1) does that mean that aggregate should expose copy of the entity to the outside world so that its internal entity is immutable from outside? or how does it expose it? 2) wat do you mean by 'queries of the root object should return values'?

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

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

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

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

关于domain-driven-design - 实体是否应该有方法,如果有,如何防止它们被外部聚合调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com