我们正在使用DDD开发一个项目,但是在如何处理查找实体方面遇到了困难。
例如,我们有一个名为“Customer”的聚合根,实体“Customer”也是聚合根。实体“Customer”具有属性“CustomerTypeID”。
但是我们还有一个表示所有现有客户类型(ID和描述)的实体“CustomerType”。将有一个管理员功能允许用户维护客户类型(例如添加新客户类型等)。
请注意,我不是在谈论更改特定客户的客户类型,而是关于维护客户类型列表。
抱歉故事有点长,下面是我的问题:
- 我是否正确地认为“CustomerType”是一个实体而不是价值对象? - “CustomerType”应该在“Customer”聚合内部,还是应该在其自己的聚合内部,因为我们将在特定客户的上下文之外访问它并维护它? - 如果此实体以及任何其他基本查找实体(例如客户状态、产品类型等)都应该是自己的聚合(并成为这些聚合的聚合根),那么我不会最终拥有数百个存储库吗? (每个聚合根都将拥有自己的存储库)
您看到了我在混乱中,只需要指向正确的方向即可。
=================================== 我试图在回复eulerfx的答案中编写一些代码,但是我无法使其工作,因此我将在这里放置。关于第2点,在屏幕上,我们显然只会显示类型的描述(例如“个人”)。那么我会得到类似于以下内容的东西吗?
但是我们还有一个表示所有现有客户类型(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上下文中存在的实体和值对象,不会成为有界上下文吗?