如何在聚合关系中强制执行不变量

How to enforce invarients in aggregate relationships

我是事件溯源和 ddd 的新手,正在尝试创建一个简单的应用程序以了解更多信息,但我正在为如何建模两个聚合之间的关系而苦苦挣扎。

这个想法是让公司创建可以被用户搜索的活动。

我希望能够执行这样的规则,即一家公司根据其会员级别只能有这么多活动。

我的第一个方法是让公司成为聚合根,其中包含活动列表并轻松控制它。但是,这意味着我必须通过公司聚合才能访问每个 Activity,这并不理想,因为大多数针对 activity 的操作并不取决于公司。

我的第二种方法是拥有单独的 Company 和 Activity aggreagtes。这意味着我必须首先引发一个 ActivityCreated 事件,然后引发一个 ActivityAddedToCompany 事件,如果公司已经充满活动,该事件将引发异常。这种方法似乎更好,但我不确定是否需要 ActivityAddedToCompany 是一个标志,表明我没有像在快乐路径中那样正确分离聚合,ActivityCreated 和 ActivityAddedToCompany将始终存储在彼此之后。

第二种方法更好还是我遗漏了领域驱动设计中的一些基本知识?

根据您的说明:

an Activity does not have to be created by a Company

这表明 Activity 应该是它自己的集合。它的生命周期不同于任何其他聚合。

An Activity can only be registered to one Company

Activity 将通过 ID 返回对公司的引用。实际上,一个外键。当它被分配给公司时,它会引发一个事件,表明分配已经完成。

a Company can only have 5 Activities at any one time

如果您使用标准 RDBMS 系统来管理这些规则,您将有一个检查活动数量并批准或拒绝添加新 Activity 的事务。同样,在您的域中,您可以通过两阶段提交对其进行建模。

当您将 Activity 分配给公司时(AssignToCompany 命令),您会引发 AssignedToCompany 事件。 ProcessManager (PM) 将接收该事件并向公司发送命令 (AssignToActivity),公司可以接受 (AssignedToActivity) 或根据计数 (RejectedAssignToActivity) 拒绝。

如果是后者,PM会收到RejectedAssignToActivity事件,并发回命令给Activity移除公司(UnassignCompany) 这将引发 CompanyUnassigned 事件。

可选:

PM 将收到 CompanyUnassigned 事件并向公司发送 UnassignFromActivity 命令。这样,您可以在需要时取消分配 activity 并让公司知道更改。