实体的id作为构造函数参数还是通过setter方法?

joh*_*ack 5 language-agnostic domain-driven-design

当你有一个实体,比如UserEntity,谁的id属性是从数据库中的主键派生出来的 - 你应该提供一个setter方法,比如setId()

一些反对的论点:

  • 打开了可能意外覆盖数据库中其他UserEntities的大门
  • 两个(或更多)UserEntities可以随时存在,具有相同id但不同的属性.(如果我从数据库中提取3个不同的用户并将其id值设置为相同)

一些论点:

  • 如果我不想id在构造函数中使用a实例化UserEntity (因为它有一个setter方法),我可以使用UserEntity对象的方法和临时/假/新用户值...而不必先保留它.

提供一个setter(并且不强制id在构造函数中),或者id在构造函数中强制一个,并删除setter?

eul*_*rfx 3

实体的身份值应该由持久层管理,并且理想情况下不能由其他任何东西设置 - 持久层应该在持久性时分配一个新的身份值,并在检索时设置它。此外,您应该能够使用瞬态(非持久)实体,而无需访问其身份。允许通过构造函数设置标识可能会导致问题,因为标识值没有权威来源。可以从外部源分配身份的一个示例是,如果客户端请求新的持久性实体将 UUID作为其身份,尽管此示例是人为设计的。