值对象的使用

Use of ValueObjects

我正在使用 Entity Framework(数据库优先和代码优先)进行开发。大多数时候,我在我的域模型中使用实体,映射到专用表。在 DDD 中,有 ValueObjects 的概念,它应该没有身份并且应该是不可变的。根据您使用 DDD 的经验,您如何使用 ValueObjects ?这是一个从创建模型中产生的概念(例如,当它处理只读数据、参数时……),或者是否有任何战略行为是预期的或可从声明对象应该像 ValueObject 一样设计的(或不是),或者应该是不可变的(或不是)?

SO 上有几个很好的值对象示例,请查看此 question

值对象的相等性不是通过检查它们是否具有相同的 id,而是通过比较值本身来确定的。

另一件需要考虑的事情是 EF 没有正确支持值对象(NHibernate 支持)。

正如 Alexey 在 Entity Framework 中所说的那样,您遇到了问题(可能会在下一个版本中解决)。要让 EF 填充您的属性,属性必须为 public 并设置为 table。这使得不可能将它们实现为值对象。 EF 应该得到增强,它也可以加载(属性化的)私有属性或字段(例如 DataContractSerializer 甚至不使用任何构造函数)来启用它。 要使用 EF 接近值对象,您可以执行以下操作:

在 EF 中将您的值对象建模为 [ComplexType]。然后它们不存储在自己的 table 中,而是将字段嵌入任何包含的实体 table 中。这接近于值语义。

为了不可变性,您可以让您的 setter 只允许一组。缺点是不变性只在运行时强制执行。另一种方法是为只有 getter 的 类 定义接口,并仅在 dal 外部使用此接口。第三种方法是将 EF 类 用作 DTO,并将它们填充到您的域模型对象中(使用真值对象)。