如何在集合关系中强制不变式

问题描述 投票:0回答:1

我不熟悉事件源和ddd,并试图创建一个简单的应用程序以了解更多信息,但是我在如何建模两个聚合之间的关系方面感到困惑。

这个想法是允许公司创建活动,然后用户可以搜索它们。

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

我的第一个方法是让公司成为包含活动列表并易于控制的汇总根。但是,这意味着我将必须通过Comapny聚合来访问每个活动,这并不是理想的选择,因为针对某个活动的大多数操作都不依赖于公司。

我的第二种方法是将公司和活动集合分开。这意味着我必须先引发一个ActivityCreated事件,然后引发一个ActivityAddedToCompany事件,如果公司已经充满了Activity,则该事件将引发异常。这种方法看起来更好,但是我不确定是否需要ActivityAddedToCompany是一个标志,因为我没有像在一条快乐的道路上那样正确地分离聚合,所以ActivityCreated和ActivityAddedToCompany总是会互相存储。

第二种方法更好还是我缺少域驱动设计中的基本知识?

domain-driven-design event-sourcing
1个回答
0
投票

根据您的说明:

不必由公司创建活动

这表明Activity应该是其自身的汇总。它的生命周期与任何其他聚合都不同。

活动只能注册到一个公司该活动将通过ID引用回公司。实际上,是外键。将其分配给公司后,将引发一个事件,指示已完成分配。

一个公司一次只能进行5个活动

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

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

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

可选:

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

© www.soinside.com 2019 - 2024. All rights reserved.