domain-driven-design - 引用另一个有界上下文的实体时应该使用实体或值对象吗?
问题描述
在我的领域中,我有两个有界上下文,identity
并且management
.
在identity
有界上下文中,我有user
实体。和管理我有visitor
和manager
。两者visitor
和manager
都有一些不同的属性,并且都引用user
.
如果visitor
并且manager
是实体,我可以使用用户 ID 作为他们的 ID 吗?我的意图是有 api 之类的visitors/:userID
。
如果它们是值对象,那么我如何为每种类型的对象保留属性?
解决方案
当有不同的有界上下文时,保持它们隔离很重要,因为它们共享相同的无处不在的语言,但含义因上下文而异。
完全可以有这样的设计。例如,在您的有界上下文中identity
,您有一个值对象UserId
(很可能)。这可以由不同的属性组成,但为了简单起见,假设它只是封装了一个String
.
然后,在您的management
有界上下文中,您可以在新类中使用 Value Object UserId
,但特定于您的有界上下文。
然后,关于你的entities
visitor
和manager
:两者都是聚合根,所以它们是entities
。它们只是您的聚合的入口点。它们是实体,但它们的 ID 是值对象UserId
。
您最终会得到以下可能的代码:
public class Visitor {
private UserId id;
// some other attributes and domain method
}
public class Manager {
private UserId id;
// some other attributes and domain method
}
这是一个非常有限的示例,但总而言之,您有:
Identity
有界上下文:1 个实体User
和 1 个 VOUserId
Management
有界上下文:2 个实体Visitor
Manager
和 1 个 VOUserId
为了进一步阅读,我推荐这个博客来深入研究正确设计一个聚合:
- Vaugh Vernon - DDD 社区 - 有效的聚合设计
- 还有这本书:Vaugh Vernon 的实现领域驱动设计
推荐阅读
- javascript - 如何对从多个数组中的数据计算的数据进行排序
- amazon-web-services - 仅当实例的状态已停止时才使用 AWS CLI 启动实例
- apache-spark - 使用 localhost 服务器从结构化 Spark 流中写入 Kafka
- android - 使用 FirebaseRecyclerAdapter 时出现 StackOverflowError
- haskell - 何时使用带有延续的 foldr 作为累积函数?
- python - 执行不返回任何内容的查询时会创建什么样的表?
- wagtail - 如何在 Draftail 中创建一个包裹在 div 中的 h2
- fancytree - 如何响应用户扩展节点?
- three.js - Potree 点击放大/缩小
- javascript - 如何更改网页中下拉滚动的初始位置?