【问题标题】:How to enforce invarients in aggregate relationships如何在聚合关系中强制执行不变量
【发布时间】:2019-09-22 11:07:54
【问题描述】:

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

这个想法是允许公司创建可供用户搜索的活动。

我希望能够执行规则,即公司只能根据其会员级别进行如此多的活动。

我的第一种方法是让 Company 成为聚合根,其中包含活动列表并轻松控制它。但是,这意味着我必须通过公司聚合来访问每个活动,这并不理想,因为针对活动的大多数行动并不依赖于公司。

我的第二种方法是让公司和活动分开。这意味着我必须首先引发一个 ActivityCreated 事件,然后是一个 ActivityAddedToCompany 事件,如果公司已经充满了活动,它将引发异常。这种方法似乎更好,但我不确定是否需要 ActivityAddedToCompany 是我没有正确分离聚合的标志,因为在快乐的路径中,ActivityCreated 和 ActivityAddedToCompany 将始终彼此存储。

第二种方法更好还是我错过了领域驱动设计中的一些基本内容?

【问题讨论】:

  • 为了帮助澄清,我建议坚持使用术语活动。您有时将这些事件称为活动,有时称为活动。您还可以互换使用 Business 和 Company,这不是那么令人震惊,但会增加混乱。定义和坚持通用语言有助于消除歧义。其次,您能否指定一个活动是否可以在没有公司的情况下存在?多个公司可以共享同一个活动吗?
  • 感谢您的回复。我仍在以明智的方式解决所有问题,但已按照您的建议编辑了我的问题以使用 Activity 和 Company。规则是活动不必由公司创建。假设一家公司在任何时候只能有 5 个活动(活动一旦发生就会被“删除”)。一个 Activiy 只能注册到一个公司。

标签: domain-driven-design event-sourcing


【解决方案1】:

根据您的说明:

活动不必由公司创建

这表明 Activity 应该是它自己的聚合。它有一个独立于任何其他聚合的生命周期。

一个活动只能注册到一个公司

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

一个公司在任何时候只能有 5 个活动

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

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

如果是后者,PM 将收到 RejectedAssignToActivity 事件并向 Activity 发送命令以删除公司 (UnassignCompany),这将引发 CompanyUnassigned 事件。

可选:

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

【讨论】:

  • 感谢您在评论中的回答和帮助,这似乎是一个更好的解决方案。我将尝试实现这一点并更多地研究流程管理器。谢谢。
  • @RobertHarvey 我没有选择最好的名字(多么讽刺),但希望它足够清楚。
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2015-03-01
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多