如何在聚合关系中强制执行不变量
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 并让公司知道更改。
我是事件溯源和 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 并让公司知道更改。