DDD - 如何处理查找实体?

4
我们正在使用DDD开发一个项目,但是在如何处理查找实体方面遇到了困难。 例如,我们有一个名为“Customer”的聚合根,实体“Customer”也是聚合根。实体“Customer”具有属性“CustomerTypeID”。
但是我们还有一个表示所有现有客户类型(ID和描述)的实体“CustomerType”。将有一个管理员功能允许用户维护客户类型(例如添加新客户类型等)。
请注意,我不是在谈论更改特定客户的客户类型,而是关于维护客户类型列表。
抱歉故事有点长,下面是我的问题:
- 我是否正确地认为“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

那么,"Customer"类内部的属性应该是CustomerTypeID吗?

关于第3点,聚合和有界上下文之间有什么区别?难道"Customer"聚合(其中"Customer"是聚合根),还包含任何仅在Customer上下文中存在的实体和值对象,不会成为有界上下文吗?

1个回答

6
  1. 是的,因为CustomerType具有标识和相关描述,所以它是一个实体。

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

  3. 如果您拥有数百个实体,特别是指定类型的实体,则可能表明项目正在变得过于庞大,您可能需要将其分区为适当的有界上下文。


我正在尝试将一些代码放在注释中,但由于这是我的第一篇帖子,我有点困难。 - Peter
我仍在苦苦挣扎,因此我已经在原始查询的底部添加了一个部分。请看一下。 - Peter
或者在“客户”类内部的属性应该是CustomerTypeID吗?这取决于客户实体是否需要访问客户类型的描述。 - eulerfx
聚合和有界上下文之间有什么区别?http://devlicio.us/blogs/casey/archive/2009/02/11/ddd-bounded-contexts.aspx - eulerfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接