我有一个简单的两个聚合根和一个正则实体的检查域。 Tenant
,UserGroup
和User
这种特定样品中Tenant
和User
弥补两个AggregateRoots。域事件处理程序什么时候开始使用?
当从UI /服务层接收到命令时,它会到达操作只写域的命令处理程序。
可以说,User
不应该是一个AggregateRoot可言,但因为它会被别人引用,它不可能是一个普通的实体。 (是的?)
这两个AggregateRoot需要进行通信。 A User
不能在不属于UserGroup
的情况下创建,该UserGroup
是Tenant
的有界上下文中的实体。据推测,我们可以通过构造函数创建一个User,因为它是一个简单的约束。 User.Create(TenantId, UserGroupId)
它生成一个带有Date,AggregateVersion和AggregateId(用户)的DomainEvent
。现在我们到了模糊的部分。
打开提交此事件到商店,此事件广播到公共汽车(内存,无论)。这就是域的事件处理程序(类似于命令处理程序)捕获创建的用户并通知/操纵Tenant
的UserGroup
以添加UserId
?
我的想法是解决这个问题的方向是完全错误的吗?
您可以通过重新考虑您的模型来简化您的问题。当您需要跨界有限的上下文通信时,或者您希望支持业务逻辑(例如电子邮件通信)来响应域事件时,域事件会很有帮助。你的模型是否需要多个有界的上下文?您是否可以在服务层中包含所有必需的操作,例如UserService? – eulerfx
你应该经常检查你是否不能模拟这个问题。然而,在这种情况下,它是一个人为的例子,旨在获得关于不同有界AR之间的通信应如何发生的答案。 – Jaapjan
“UserGroup中的未来行为需要UserId?”是一个非常重要的问题(否则你为什么要在聚合之间进行交流)。如果您的域名不是多租户(不要与多租户混淆为非功能性需求),让租户成为您域名的一部分似乎很奇怪。如果他们在同一个BC中,请使用您的域对象与一些TDA进行协作。 –