【问题标题】:Domain Driven Design, SOC, and entity identification领域驱动设计、SOC 和实体识别
【发布时间】:2010-10-05 19:09:50
【问题描述】:

我一直在努力思考 DDD 以及它与 MVC 的关系,但我在实体识别方面遇到了麻烦。

特别是,我试图在我的演示文稿、域和数据模型之间保持严格的分离。我的问题在于我如何跨这些边界保存实体标识。澄清一下,我使用不同的类来表示不同上下文中的同一实体 - 例如,我有一个“ShipmentRequest”域类、几个“ShipmentRequestView”表示类(取决于特定视图所需的属性)和一个'shipment_request' 数据库表(我的数据模型)。​​

我觉得使用“ID”属性(如 ShipmentRequestId)会违反我试图实现的分离,因为此 ID 属性是数据库问题,而不是域问题;而且我不想在层之间传递相同的对象,因为这意味着将不需要的数据传递到我的表示层。

如何保持这种分离,同时跟踪这些层之间的身份?

【问题讨论】:

    标签: mapping domain-driven-design separation-of-concerns


    【解决方案1】:

    如果您的实体中没有 Id 字段,您将无法将其映射到数据库行。因此,即使这个 id 字段与您的实体无关,它也必须泄漏到您的域模型中。

    我觉得使用表示模型通常是矫枉过正的,特别是如果您想要实现的是隐藏某些属性。

    我认为关注点分离主要是由有界上下文驱动的。例如,您的 Person、PersonView 和 Person 表似乎都与事务处理上下文有关。在这种情况下,我什至没有 PersonView 并且 person 表将被抽象掉。

    另一方面,如果您在报告上下文中,PersonView 会更有用。

    我认为上下文比任何分层方案都重要。

    至于您的 person 实体中缺少自然键,这可能意味着 Person 不是真正的实体。例如,在任何现实生活中的应用程序中,总是有一个与人相关联的号码:员工有员工号码,客户作为帐号等。这个企业 id 肯定是域的一部分。

    【讨论】:

    • 如果一个人不是一个实体,它是什么?它不能是一个值对象——一个以上的自然人可以有相同的名字和其他统计数据。不管我以 Person 为例,都不能代表我实际工作的领域。
    • 也就是说,您关于上下文的观点很重要。谢谢你。 =)
    • Person 通常被用作人们使用的标准示例,但我认为这是一个不好的示例,因为没有上下文。
    • 假设我正在做一些人口统计分析,我不关心任何特定人的身份,我只关心它的属性。在这种情况下,Person 可以是一个值对象吗?
    • 我想这取决于所讨论的属性。在这种情况下,我会这么说。关于这个例子的好点 - 也许我会用一个更好的问题重构我的问题。
    【解决方案2】:

    我认为在实体上设置“ID”字段是很多(大多数?)人们最终做出的让步,我不会为此感到内疚。

    正如您所说,即使您不处理数据库,您仍然需要一些身份概念。您可以尝试为每个实体(名称等字段或多个字段的组合)提出某种“自然”身份,但这并不总是可行的。即使是这样,拥有一个 ID 字段通常也可以作为一种方便的简写形式来表示“名称为 X、出生日期为 Y、SSN 为 Z 的实体”。

    最后,虽然可以说不那么“纯粹”,但拥有一个 ID 字段可能会大大简化事情。

    【讨论】:

    • 这可能是我最终不得不做的事情。感谢您的回答。 =)
    【解决方案3】:

    Shipment Request 绝对是一个更好的例子!

    用户如何找到发货请求? 根据答案,您可能需要用户可能记得的 id,例如 20091012-A。

    装运请求 ID 可以更改吗? 如果否,请使用 db 密钥作为标识。

    您是否需要将装运请求从一个系统转移到另一个系统? 如果是,请不要使用 db 密钥作为标识。

    无论您使用什么键,您都需要使其在演示模型中可用,以便您可以建立指向特定装运请求操作的链接。

    【讨论】:

    • 用户通过搜索机制或通过列出属于客户的 SR 等方式找到 SR。ID 可以用于(例如在电子邮件中)指出特定的SR,但 SR 永远不会被其他系统使用。我想 DB key 是解决这个问题的方法。
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多