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

时间:2012-03-16 16:43:54

标签: language-agnostic domain-driven-design entity

我有一个UserEntity,最终根据它的id属性保存在DB中。在这种情况下,id属性显然是敏感的,因为更改它会导致UserEntity在以后保留时保存在不同的UserEntity上。

我希望能够帮助安全防范这种情况发生......

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

  • 这意味着存储库被赋予持久化的每个UserEntity都是有效的(因为它具有id的最低要求)。
  • 缺点是我的Controller无法创建新的UserEntity(),因为它没有id来提供它。

选项2.允许构造函数中的Id为null,但不提供Setter

  • 这实际上会创建两种类型的UserEntity对象:已经持久化的对象和没有持久化对象的对象。
  • 我可以在任何地方执行新的UserEntity(),用它的值填充它,然后传递给存储库,然后保存它,使用新的id创建一个新的UserEntity,并将其还原。
  • 这很酷,但意味着我需要仔细检查我的实体是否有id我希望将其用于持久化/域逻辑/等,以确保它是一个已保存的实体。< / LI>

选项3.我不担心这么多,并为它提供一个制定者吗?

  • 这会暴露更改UserEntity的id并覆盖db中的其他UserEntity的风险。
  • 从好的方面来说,我可以在不知道id的情况下创建一个新的UserEntity(),我可以将其传递到我的存储库进行保存。

1 个答案:

答案 0 :(得分:3)

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

这意味着您不会在不想直接更改的属性上提供setter,而是使用指定的方法来改变它们的状态。

如果示例中的id永远不会更改,则只应在构造函数中设置它(并强制传入)。