【问题标题】:DDD: Classify entity/value objectDDD:分类实体/值对象
【发布时间】:2012-04-01 18:33:27
【问题描述】:

我刚开始学习领域驱动设计,最让我困惑的几件事之一是如何确定哪个应该是实体,哪个应该是值对象

我知道要确定实体/值对象,我们需要基于领域上下文,在一种情况下,一个领域对象可以是实体,在另一种情况下,它可以是值对象,但还是有一些情况我可以'决定

。地址 - 在客户管理应用程序的上下文中(比如说一个管理客户、添加/删除/更改客户状态等的应用程序),地址显然是价值对象,因为在这里我们不需要区分一个地址和另一个地址, 2 个客户可以有相同的地址 - 另一方面,在在线预订应用程序的上下文中,我可以说地址是一个实体吗?因为现在我们需要通过账单地址来区分客户(暂时忽略具有相同地址的案例 2 客户)

对我来说,地址本身就是独一无二的,所以它肯定已经有了身份。所以域对象的身份不会决定它是实体还是值对象,如果是,那么选择的关键因素是什么?

另一个例子,我有一个应用程序列出了一个国家/地区的多个地区,用户可以选择一个地区,然后找到该地区符合其搜索条件的所有餐厅。在这种情况下,区域是值对象还是实体?目前我认为它更多的是在一个实体上,但仍然不是很确定。每个区域也都是独一无二的

我不确定我的问题是否清楚,我尽力解释我目前的想法

【问题讨论】:

    标签: object dns domain-driven-design entity


    【解决方案1】:

    我认为您的一些困难可能在于其中一些术语的微妙含义。例如,您提到“对我来说,地址本身就是唯一的,所以它肯定有身份”。就大多数人在域驱动设计中如何使用“身份”而言,您的陈述可能是不正确的。

    值对象的一组属性它的定义。如果你改变它的任何方面,你就会有一个完全不同的对象。使用您的地址示例,如果您更改其中的任何部分,您将获得一个完全不同的地址。它是相同的地址,但它的某些方面发生了变化。您的客户搬到了新地址;他们没有改变同一地址的各个方面。

    但是,如果您是一个地图应用程序并且地址本身发生了变化,那么这里的地址将是一个实体。在这种情况下,城市规划者可能希望重新编号街道上的房屋。在这种情况下,SAME 地址正在被修改。在这种情况下,我们需要更新实体,而不是值对象。

    关于您的帐单地址示例,帐单地址可能仍然是一个价值实体(至少是它的物理地址部分)。支付方式(例如信用卡)可能是该示例中的实体,它可能包括其他值对象(例如帐单地址、信用卡号等)。

    查看此问题及其答案可能会对您有所帮助:Value vs Entity objects (Domain Driven Design)

    希望这会有所帮助。祝你好运!

    【讨论】:

    • 非常感谢,您的解释正是我要找的,现在一切都清楚了
    • 谢谢,Phuong,很高兴它有帮助。
    猜你喜欢
    • 2010-10-04
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多