我刚开始阅读DDD。 我无法完全掌握Entity vs Value对象的概念。有人可以解释当Value对象被设计为Entity对象时系统可能遇到的问题(可维护性,性能等等)吗? 例子很棒......

===============>>#1 票数:98

减少到本质区别,身份对实体很重要,但对价值对象无关紧要。 例如,某人的姓名是值对象。 Customer实体可能由客户名称(值对象),List <Order> OrderHistory(实体列表)以及可能的默认地址(通常是值对象)组成。 客户实体将拥有一个ID,每个订单都有一个ID,但名称不应该; 通常,无论如何,在对象模型中,地址的标识可能无关紧要。

值对象通常可以表示为不可变对象; 更改值对象的一个​​属性实质上会破坏旧对象并创建一个新对象,因为您不像内容那样关注身份。 正确地,只要对象的属性与另一个实例的属性相同,Name上的Equals实例方法将返回“true”。

但是,更改像Customer这样的实体的某些属性不会破坏客户; 客户实体通常是可变的。 身份保持不变(至少一旦对象被持久化)。

您可能在没有意识到的情况下创建了值对 无论何时通过创建细粒度类来表示实体的某些方面,您都有一个值对象。 例如,类IPAddress(对有效值有一些约束但由更简单的数据类型组成)将是一个值对象。 EmailAddress可以是字符串,也可以是具有自己的一组行为的值对象。

甚至在数据库中具有标识的项目也很可能在对象模型中没有标识。 但最简单的情况是一些有意义的属性的组合。 当您可以将Customer.Name组合在一起时,您可能不希望拥有Customer.FirstName,Customer.LastName,Customer.MiddleInitial和Customer.Title; 在您考虑持久性时,它们可能是数据库中的多个字段,但您的对象模型并不关心。

===============>>#2 票数:31

由所有属性共同定义的任何对象都是值对象。 如果任何属性发生更改,则会有一个值对象的新实例。 这就是将值对象定义为不可变的原因。

如果对象未被其所有属性完全定义,则存在构成对象标识的属性子集。 其余属性可以更改而无需重新定义对象。 这种对象不能在immutable中定义。

一种更简单的区分方法是将值对象视为永不改变的静态数据,将实体视为应用程序中演变的数据。

===============>>#3 票数:6

我不知道以下是否正确,但我会说,在Address对象的情况下,我们希望将它用作值对象而不是实体,因为对实体的更改将反映在所有链接对象上(例如一个人)。

以这种情况为例:你和其他人一起住在你的房子里。 如果我们使用Entity for Address,我会争辩说所有Person对象都会链接到一个唯一的Address。 如果一个人搬出,你想要更新他的地址。 如果要更新地址实体的属性,则所有人都将拥有不同的地址。 在值对象的情况下,我们将无法编辑地址(因为它是不可变的),我们将被迫为该Person提供新的地址。

这听起来不错吗? 在阅读DDD书之后,我必须说我仍然对这种差异感到困惑。

更进一步,如何在数据库中建模? 您是否将Address对象的所有属性都作为Person表中的列,或者您是否会创建一个也具有唯一标识符的单独Address表? 在后一种情况下,生活在同一个房子里的人每个都有一个不同的Address对象实例,但这些对象除了ID属性外都是相同的。

===============>>#4 票数:4

价值类型:

  • 值类型本身不存在,取决于实体类型。
  • 值类型对象属于实体类型对象。
  • 值类型实例的生命周期受拥有实体实例的生命周期的限制。
  • 三种值类型:基本(原始数据类型),复合(地址)和集合(映射,列表,数组)

实体:

  • 实体类型可以自己存在(身份)
  • 一个实体有自己的生命周期。 它可以独立于任何其他实体而存在。
  • 例如:人,组织,学院,移动,家庭等。每个对象都有自己的身份

===============>>#5 票数:3

address可以是依赖于busiess进程的实体或值对象。 地址对象可以是快递服务应用程序中的实体,但地址可以是某些其他应用程序中的值对象。 在快递申请中,地址对象的身份问题

===============>>#6 票数:2

我在另一个帖子中询问了这个问题,我觉得我还是很困惑。 我可能会将性能考虑因素与数据建模混淆。 在我们的编目应用程序中,客户在需要之前不会更改。 这听起来很愚蠢 - 但客户数据的“读取”数量远远超过“写入”,并且由于许多网络请求都是针对“活动集”的对象,我不想一次又一次地加载客户。 所以我走向了一个不可变的客户对象之路 - 加载它,缓存它,并为想要看到客户的99%(多线程)请求提供相同的服务。 然后,当客户更改某些内容时,请获取“编辑”以创建新客户并使旧客户无效。

我担心的是,如果许多线程看到相同的客户对象并且它是可变的,那么当一个线程开始改变时,其他线程就会发生混乱。

我现在的问题是,1)这是合理的,2)如何最好地做到这一点,而不重复关于属性的大量代码。

===============>>#7 票数:0

3 EntitiesValue Objects之间的区别

  • 标识符与结构相等:实体具有标识符,如果实体具有相同的标识符,则它们是相同的。 超出对象的值对象具有结构相等性,当所有字段相同时,我们认为两个值对象相等。 值对象不能具有标识符。

  • 可变性与不变性:值对象是不可变的数据结构,而实体在其生命周期中发生变化。

  • 寿命:值对象应属于实体

  ask by translate from so

未解决问题?本站智能推荐:

1回复

实体框架4.0和DDD模式

我将EntityFramework用作ORM,我有一个简单的POCO域模型,带有两个表示值对象和实体对象模式(Evans)的基类。 这两种模式都是关于两个对象的相等性,因此我覆盖了Equals和GetHashCode方法。 这是这两个类: 一切正常,直到我尝试删除一些相关对象(将根对
1回复

域驱动的设计可以重视对象的引用/嵌入实体

我在理解ddd值对象时遇到了一个小问题,因此我的领域提出了几个问题,我确实需要帮助解决它们, 第一个问题: 可以说我有一个car实体和一个wheel值对象, wheel有两个实体,分别是rubber和rims所以问题是车轮是否允许在其中包含实体? 例如: 第二个问题:
3回复

在实际项目中确定领域驱动设计中的实体和值对象

这是我第一次在实际项目中实现域驱动设计的概念。 该项目是关于为员工签发许可证,使他们能够进入公司场所。 通过Intranet网站,已经拥有员工ID的员工将能够申请许可证或在许可证被损坏或丢失的情况下申请更换许可证。 管理员将处理申请并最终交出实际许可。 我有几个实体- User ,
1回复

域驱动设计可以使Aggragate根成为价值对象

我和我的大学正在讨论“域驱动设计”上下文中的“价值对象和实体”。 这有点理论性,所以也许回答起来并不那么容易。 第一个问题:汇总根可以是值对象吗? 第二个问题:在下图中,您可以看到域模型。 它包含聚合根以及包含聚合根ID的相关值对象。 链接到图片 它们是实体还是价值对
1回复

如何在域驱动设计中的表单和值对象之间共享验证?

#1 验证表单上的电子邮件地址 我有一个带有emailAddress属性的后端表单类,该类具有验证逻辑,以便可以将错误消息返回给用户。 我用以下方法验证所有表单输入: #2。 在命令处理程序中验证EmailAddress值对象 我有一个命令处理程序,它将使用原始字符串电
1回复

待更新模块-域实体还是值对象?

我正在将大型经典的ASP Web应用程序转换为具有域驱动设计的ASP.Net MVC。 尽管我的大部分领域都适合DDD,但我一直遇到不适合使用纯DDD方法的情况。 例如,我的应用程序的读取端与写入端明显不同。 没问题,我创建了一个单独的读取模型,并实现了CQRS的简化版本(没有事件源,没有
1回复

值对象与实体

快速提问...当接近类似电子邮件地址的东西时,最直接的想法是将其视为价值对象。 如果我们有许多实体,比如客户,联系人和供应商引用相同的电子邮件地址,可以想象当我们更改客户的电子邮件地址时,我们可能希望与客户联系,他们可能是供应商也将这些电子邮件更改反映在这些实体中。 我是否认为这是给出了
3回复

DDD查找为实体或值对象

我从域驱动开发开始,经过大量阅读后,我试图以DDD方式重构应用程序。 但是我面临一个基本问题,不确定如何解决。 作为介绍,我的应用程序应该执行一些简化的任务。 这是一个课程预订应用程序: 一门课程包括类别,日期时间,描述和位置 可以从下拉框中选择类别和位置 一
1回复

域驱动设计-无属性类

对于Craig Larmans在设计域模型上的工作,拥有无属性的类是有效的。 他们具有行为角色。 当将类定义为与Eric Evans的工作相关的实体和值对象时,我无法确定无属性类是否应为值对象或应为什么。 如何实施?
1回复

使用值对象验证实体的性能问题

我有以下值对象代码,这些对象代码通过一些昂贵的数据库操作来验证CustCode。 public class CustCode : ValueObject<CustCode> { private CustCode(string code) { Value = code; }