【问题标题】:DDD - how should look-up entities be treated?DDD - 应该如何处理查找实体?
【发布时间】:2012-01-14 05:27:16
【问题描述】:

我们正在开发一个使用 DDD 的项目,但在如何处理查找实体方面陷入困境。 例如,我们有一个名为“Customer”的聚合,实体“Customer”也是聚合根。实体“Customer”具有属性“CustomerTypeID”。

但我们也有一个实体“CustomerType”代表所有现有的客户类型(ID 和描述)。将有一个管理功能允许用户维护客户类型(即添加新的客户类型等)。

请注意,我说的不是更改特定客户的客户类型,而是维护客户类型列表。

对于这个冗长的故事,我深表歉意,但这里是我的问题:

  • 我认为“CustomerType”是实体而不是值对象是否正确?

  • “CustomerType”应该在聚合“Customer”中还是应该在它自己的聚合中,因为我们将在特定客户的上下文之外访问和维护它?

  • 如果这个实体和任何其他作为基本查找实体的实体(如客户状态、产品类型等)应该是它们自己的聚合(并且是这些聚合的聚合根),我不打算最终拥有数百个存储库? (因为每个聚合根都有自己的存储库)

如你所见,我在这里陷入了混乱,只需要指出正确的方向。

==================================== 我试图写一些代码来回复 eulerfx 的回复,但我无法让它工作,所以我把它放在这里。

关于第 2 点,我们显然只会在屏幕上显示类型的描述(例如“个人”)。这是否意味着我最终会得到这样的结果?:

Public Class Customer
    Inherits EntityBase(Of Integer)
    Implements IAggregateRoot

    Public Property CustomerID As Integer
    ...
    Public Property CustomerType As CustomerType
    ...

公共类 CustomerType 继承 EntityBase(Of Integer) 实现 IAggregateRoot

    Public Property CustomerTypeID As Integer
    Public Property CustomerTypeDescription As String

或者“客户”类中的属性应该是 CustomerTypeID?

关于第 3 点,聚合和有界上下文有什么区别?难道“客户”聚合(其中“客户”是聚合根),它还包含仅存在于客户上下文中的任何实体和值对象,不是有界上下文吗?

【问题讨论】:

    标签: domain-driven-design aggregate aggregateroot


    【解决方案1】:
    1. 是的,因为CustomerType 有一个身份和相关的描述,所以它是一个实体。

    2. Customer 类是否具有CustomerType 属性或CustomerTypeId 属性取决于它是否需要访问CustomerType 上的其他属性。无论哪种方式,CustomerType 都是拥有自己存储库的自己的实体。

    3. 如果您有数百个实体,特别是您指定的类型,则可能表明项目变得太大,您可能需要划分为适当的有界上下文。

    【讨论】:

    • 我正在尝试在评论中添加一些代码,但由于这是我的第一篇文章,我有点挣扎。
    • 仍在苦苦挣扎,因此我在原始查询的底部添加了一个部分。请看一下
    • > 或者“Customer”类中的属性应该是 CustomerTypeID?这取决于客户实体是否需要访问客户类型的描述。
    • > 聚合上下文和有界上下文有什么区别? devlicio.us/blogs/casey/archive/2009/02/11/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多