我不熟悉事件源和ddd,并试图创建一个简单的应用程序以了解更多信息,但是我在如何建模两个聚合之间的关系方面感到困惑。
这个想法是允许公司创建活动,然后用户可以搜索它们。
我希望能够执行这样的规则,即一家公司只能根据其会员级别来进行许多活动。
我的第一个方法是让公司成为包含活动列表并易于控制的汇总根。但是,这意味着我将必须通过Comapny聚合来访问每个活动,这并不是理想的选择,因为针对某个活动的大多数操作都不依赖于公司。
我的第二种方法是将公司和活动集合分开。这意味着我必须先引发一个ActivityCreated事件,然后引发一个ActivityAddedToCompany事件,如果公司已经充满了Activity,则该事件将引发异常。这种方法看起来更好,但是我不确定是否需要ActivityAddedToCompany是一个标志,因为我没有像在一条快乐的道路上那样正确地分离聚合,所以ActivityCreated和ActivityAddedToCompany总是会互相存储。
第二种方法更好还是我缺少域驱动设计中的基本知识?
根据您的说明:
不必由公司创建活动
这表明Activity应该是其自身的汇总。它的生命周期与任何其他聚合都不同。
活动只能注册到一个公司该活动将通过ID引用回公司。实际上,是外键。将其分配给公司后,将引发一个事件,指示已完成分配。
一个公司一次只能进行5个活动
如果您使用标准的RDBMS系统来管理这些规则,则将有一个事务来检查活动数,并批准或拒绝添加新的活动。同样,在您的域中,您可以通过两阶段提交对此进行建模。
将活动分配给公司时(AssignToCompany命令),将引发AssignedToCompany事件。 ProcessManager(PM)将接收该事件并将命令发送给公司(AssignToActivity),公司可以接受(AssignedToActivity),也可以基于计数拒绝该事件(RejectedAssignToActivity)。
如果是后者,则PM将接收RejectedAssignToActivity事件,并将命令发送回Activity以删除将引发CompanyUnassigned事件的公司(UnassignCompany)。
可选:
PM将收到CompanyUnassigned事件,并将UnassignFromActivity命令发送给公司。这样,您可以在需要时取消分配活动,并使公司知道更改。