【问题标题】:Repositories and Roots of aggregates聚合的存储库和根
【发布时间】:2015-06-06 23:25:30
【问题描述】:

我正在阅读 Eric Evans DDD 的一本书。 我发现了一个矛盾。

关于聚合的章节书:

选择一个 ENTITY 作为每个 AGGREGATE 的根,并控制所有 通过root访问边界内的对象。

关于存储库的章节书:

持久对象的子集必须可以通过 基于对象属性的搜索。根需要这种访问权限 不方便通过遍历到达的聚合体。他们是 通常是实体,有时是具有复杂内部的价值对象 结构,有时是枚举值。提供访问其他 对象混淆了重要的区别。

仅为实际需要的 AGGREGATE 根提供存储库 直接访问。

可以得出聚合的根可以是:

  • 实体
  • 值对象
  • 枚举值

没错,我什么都明白了吗?

或许是对的:

仅为

提供存储库
  • 聚合根
  • 值对象
  • 枚举值 ?

什么是枚举值(需要自己的存储库!)?

【问题讨论】:

  • 聚合的根始终是一个实体。此外,您只为聚合根提供存储库。值对象和枚举没有生命周期,需要通过全局唯一标识定位。
  • 但是对于全局访问值对象和枚举需要它们自己的存储库。不是吗?
  • 值对象由它们的属性而不是全局 id 来标识。根据有界上下文,值对象可能是另一个 BC 中的聚合。此外,vaughn vernon 调用枚举/查找数据标准类型,可以简单地从数据源加载。

标签: domain-driven-design ddd-repositories


【解决方案1】:

根据上面@Marco 的评论,聚合的根只能是一个实体(即具有 ID 属性的东西)。这方面的一个例子是Order 对象。无论您在 Order 上更改了多少属性,其质量都由其 Id 属性决定,仅此而已。

value object(在许多语言中通常实现为 struct)没有 ID。一个常见的例子是具有Dollars 属性和Cents 属性的Money 值对象。因为没有ID,所以不适用按ID查询的概念,也不适用仓库的概念。不过,聚合可以将值对象作为属性(例如 Order 聚合上的 Total 属性)。

enumerated type 只是名称/值对的列表。它在多种语言中使用enum 关键字。同样,枚举及其任何成员都没有 ID,因此存储库的概念不适用。枚举的概念在 DDD 中很有用,因为它有助于更​​好地表达领域模型,而不是幻数,例如order.Status = OrderStatus.Submittedorder.Status = 1.

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多