Domain driven design 如何在聚合关系中实施不变性

Domain driven design 如何在聚合关系中实施不变性,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,我不熟悉事件源和ddd,并尝试创建一个简单的应用程序来了解更多信息,但我正在研究如何在两个聚合之间建立关系模型 其想法是允许公司创建用户可以搜索的活动 我希望能够强制执行这样一条规则,即一家公司只能根据其会员级别开展如此多的活动 我的第一种方法是让公司成为聚合根,它将包含活动列表,并可以轻松地控制它。然而,这意味着我必须通过Comapny聚合来访问每项活动,这并不理想,因为针对某项活动的大多数操作并不依赖于公司 我的第二个方法是将公司和活动集团分开。这意味着我必须首先引发ActivityCrea

我不熟悉事件源和ddd,并尝试创建一个简单的应用程序来了解更多信息,但我正在研究如何在两个聚合之间建立关系模型

其想法是允许公司创建用户可以搜索的活动

我希望能够强制执行这样一条规则,即一家公司只能根据其会员级别开展如此多的活动

我的第一种方法是让公司成为聚合根,它将包含活动列表,并可以轻松地控制它。然而,这意味着我必须通过Comapny聚合来访问每项活动,这并不理想,因为针对某项活动的大多数操作并不依赖于公司

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


第二种方法更好,还是我缺少领域驱动设计的一些基础知识?

根据您的澄清:

活动不必由公司创建

这表明活动应该是自身的集合。它具有与任何其他聚合分开的生命周期

一项活动只能注册到一家公司

该活动将通过ID(实际上是外键)返回对公司的引用。将其分配给公司时,会引发一个事件,指示已进行分配

一家公司一次只能有5项活动

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

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

如果是后者,PM将接收到拒绝分配活动事件,并将命令发送回活动以删除公司(取消分配公司),这将引发公司未分配事件

可选:


项目经理将收到公司未分配的事件,并向公司发送UnassignFromActivity命令。通过这种方式,您可以在需要时取消分配活动,并让公司了解更改

为了帮助澄清,我建议坚持使用术语“活动”。你有时称这些事件,有时称之为活动。您还可以互换地使用业务和公司,这并不是太过分,但会增加混乱。定义和坚持一种普遍存在的语言有助于消除歧义。第二,你能否具体说明一项活动是否可以在没有公司的情况下存在?多个公司可以共享同一活动吗?谢谢你的回复。我仍在努力解决命名方面的问题,但我已经编辑了我的问题,按照你的建议使用活动和公司。规则是,活动不必由公司创建。假设一家公司一次只能有5项活动(一旦活动发生,这些活动将被“删除”)。活动只能注册到一家公司。感谢您的回答和评论中的帮助,这似乎是一个更好的解决方案。我将尝试实现这一点,并更多地研究流程管理器。谢谢。@RobertHarvey我没有选择最好的名字(多么讽刺),但希望它足够清楚。