【问题标题】:DDD Global Value ObjectDDD 全局值对象
【发布时间】:2012-08-24 23:57:51
【问题描述】:

我需要在多个对象中引用 TimePeriod(AM、PM、NIGHT 等)。例如。预定会议、实际会议。

虽然 TimePeriod 在数据库中带有 ID,但它绝对不是实体,因为它不会更改,并且所有对象的“AM”周期都是相同的。

我的困难在于知道如何从数据库中检索这个值对象。由于不同的对象可以引用它,它不应该是它们的任何存储库方法的一部分,但同时它不应该真的拥有自己的存储库,因为它不是根。

那么你会建议如何从数据库中获取它?

谢谢。

更新

我接受了 eulerfx 的回答,因为他解释说句点仍然可以通过存储库从数据库返回,尽管我不太喜欢为多个全局值对象设置多个小型存储库的想法.这个区域对我来说仍然有点灰暗。

【问题讨论】:

  • 如果它永远不会改变,为什么不将表硬编码为全局查找?
  • 因此,如果我有多个这种类型的查找(例如会议长度),但在数据库中有不同的“ID”类型,我是否只有一个全局查找服务,其中两种方法是'TimePeriod GetTimePeriods'和'MeetingLength GetMeetingLengths'?
  • 可能 - 这绝对属于“服务”范畴,但我不知道这种特定于域的方法是否合适。
  • 但问题是值(查找)对象的 ID 可能为 Guid 或 int,并且一个值对象可能比另一个值对象具有更多字段,这使得创建通用对象 (IValueObjectLookup) 变得困难且混乱- 否则从服务中返回会很好。 (如果返回类型是您在谈论适当性时的意思 - 每个值对象的服务肯定会过大)。
  • 值对象不应该有 ID。它的“身份”是由它的价值定义的。

标签: domain-driven-design ddd-repositories value-objects


【解决方案1】:

由于TimePeriod是一个值对象,当其他对象引用它时,它们引用的是值本身而不是ID。使时间段对象不可变,这样一旦对象引用了时间段,它就知道它不会改变。时间段值可以存储在数据库表中,然后表记录具有 ID,但是这些不需要在代码中表示。您可以有一个简单的存储库来检索时间段,例如,如果您希望提供一个显示可用时间段列表的 UI。存储库总是不必只返回聚合。如果时间段本质上是高度静态的,那么您可以考虑在内存中缓存,甚至拥有一个包含所有可用时间段的静态类。

【讨论】:

  • “存储库并不总是必须只返回聚合。”这不是违背埃文的理念吗?
  • 在他的书中关于存储库的部分中,他指出存储库还可以返回汇总计算等。我认为存储库可以有多种含义,具体取决于视角。有些人仅将它们视为与聚合相关的,而另一些人则将它们视为更一般的数据源抽象。
【解决方案2】:

虽然TimePeriod在数据库中有ID,但它绝对不是实体,因为它不会改变。

只要一个对象有一个明确定义的生命周期,它就可以是一个实体,即使它的内容没有改变。要问的问题是“TimePeriods 会被动态创建和删除吗?”

  • 是吗?那么 TimePeriod 应该是一个拥有自己存储库的实体。这是 Eric Evans 在他的 DDD 书中描述的 knowledge level 的一个示例。

  • 不是吗?那你就不需要数据库了,只需要静态定义TimePeriods即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2010-10-31
    • 2014-06-03
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2012-04-01
    相关资源
    最近更新 更多