Language agnostic 如何处理域实体所需的属性?

Language agnostic 如何处理域实体所需的属性?,language-agnostic,domain-driven-design,entity,Language Agnostic,Domain Driven Design,Entity,我有一个UserEntity,它最终根据它的id属性持久化到数据库中。在这种情况下,id属性显然是敏感的,因为更改它会导致在以后持久化时将UserEntity保存到另一个UserEntity上 因此,我想帮助安全防范类似事件的发生 选项1。我是否强制将id传递到构造函数中,从而删除Setter? 这意味着存储库被赋予持久化的每个用户实体都是有效的(因为它的最低要求是id) 缺点是我的控制器无法创建新的UserEntity(),因为它没有id 选项2。允许构造函数中的Id为null,但不提供S

我有一个UserEntity,它最终根据它的
id
属性持久化到数据库中。在这种情况下,
id
属性显然是敏感的,因为更改它会导致在以后持久化时将UserEntity保存到另一个UserEntity上

因此,我想帮助安全防范类似事件的发生

选项1。我是否强制将
id
传递到构造函数中,从而删除Setter?

  • 这意味着存储库被赋予持久化的每个用户实体都是有效的(因为它的最低要求是
    id
  • 缺点是我的控制器无法创建新的UserEntity(),因为它没有
    id
选项2。允许构造函数中的Id为null,但不提供Setter

  • 这实际上会创建两种类型的UserEntity对象:已持久化的对象和未持久化的对象
  • 我可以在任何地方创建新的UserEntity(),用它的值填充它,然后传递给存储库,存储库将保存它,用新的
    id创建一个新的UserEntity,然后将它返回
  • 这很酷,但意味着我需要再次检查我的实体是否有一个
    id
    ,我想在任何地方使用它来持久化/domain logic/etc,以确保它是一个保存的实体
选项3。我是否不太担心,并为此提供一个设置器?

  • 这暴露了更改用户实体的
    id
    ,并覆盖数据库中不同用户实体的风险
  • 另一方面,我可以创建一个新的UserEntity(),而不必事先知道
    id
    ,我可以将其传递到存储库进行保存

如果您关心域对象的有效性,则需要始终确保其有效性

这意味着您不需要为不希望直接更改的属性提供setter,而是使用指定的方法来改变它们的状态


如果示例中的
id
从未更改,则只应在构造函数中设置它(并强制将其传入)。

如果您关心域对象的有效性,则需要始终确保其有效性

这意味着您不需要为不希望直接更改的属性提供setter,而是使用指定的方法来改变它们的状态


如果示例中的
id
从未更改,您应该只在构造函数中设置它(并强制将其传入)。

谢谢您的回答!显然,在这种情况下,很可能没有方法从
id
的正常上下文中变异
id
正确吗?@johnnietheblack,是的。您将为确实发生变异但需要验证的属性提供一种方法。@johnnietheblack,也请分享您的疑问。通过将实体的setter转换为private并通过构造函数参数独占地接收此值,解决了此问题。在我的存储库中“添加”的方法负责返回我的更新实体以及您的个人id。谢谢您的回答!显然,在这种情况下,很可能没有方法从
id
的正常上下文中变异
id
正确吗?@johnnietheblack,是的。您将为确实发生变异但需要验证的属性提供一种方法。@johnnietheblack,也请分享您的疑问。通过将实体的setter转换为private并通过构造函数参数独占地接收此值,解决了此问题。在我的存储库中“添加”的方法负责返回我的更新实体以及您的个人id。