Domain driven design 包含大量子项的聚合根

Domain driven design 包含大量子项的聚合根,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我想知道如何使用DDD和CQR为日历建模。我的问题在于越来越多的事件。我认为日历是包含事件(日历事件)的聚合根。我不想在命令中使用ReadSide,但我需要在域级别检查事件冲突的方法。事件也可以是聚合根。我不知道您的业务限制,但我认为如果两个事件同时发生,您可以以某种方式通知用户采取手动操作。否则,如果你真的不需要它们,你可以使用快照来加速巨大的日历AR 我不想在命令中使用ReadSide,但我需要一种在域级别检查事件冲突的方法 无法在聚合命令处理程序中查询读取模型。对于冲突检测,我将创建一个特

我想知道如何使用DDD和CQR为日历建模。我的问题在于越来越多的事件。我认为日历是包含事件(日历事件)的聚合根。我不想在命令中使用ReadSide,但我需要在域级别检查事件冲突的方法。

事件也可以是聚合根。我不知道您的业务限制,但我认为如果两个事件同时发生,您可以以某种方式通知用户采取手动操作。否则,如果你真的不需要它们,你可以使用快照来加速巨大的日历AR

我不想在命令中使用ReadSide,但我需要一种在域级别检查事件冲突的方法


无法在聚合命令处理程序中查询读取模型。对于冲突检测,我将创建一个特殊的
detectLisionsAga
,订阅
EventScheduled
事件,并在冲突发生时检查(如果有许多事件,则可能是异步的)并以某种方式通知用户。

事件也可以是聚合根。我不知道您的业务限制,但我认为如果两个事件同时发生,您可以以某种方式通知用户采取手动操作。否则,如果你真的不需要它们,你可以使用快照来加速巨大的日历AR

我不想在命令中使用ReadSide,但我需要一种在域级别检查事件冲突的方法

无法在聚合命令处理程序中查询读取模型。对于冲突检测,我将创建一个特殊的
detectLisionsAga
,订阅
EventScheduled
事件,并在冲突发生时进行检查(如果有许多事件,则可能是异步的),并以某种方式通知用户

我想知道如何使用DDD和CQR为日历建模。我的问题在于越来越多的事件

对于“长寿”聚合,最常见的答案是将其寿命分成几段。这方面的一个例子是会计师将在最后关停的临时账户

在您的特定情况下,可能不是“日历”,而是“二月日历”、“三月日历”,等等,在您的领域中,任何合适的粒度

我不确定我对DDD的确认是否正确。我认为关键是不允许模型进入无效状态

是的,但定义无效状态是一件棘手的事情。乌迪大汉提议

时间上的微秒差异不应该对核心业务行为产生影响

更简洁地说,先处理命令A,再处理命令B,会生成一个有效状态,然后也应该是先处理命令B,然后处理命令A

让我们选择“事件碰撞”示例。假设我们处理两个命令
schedulemeting(A)
schedulemeting(B)
,域模型理解
A
B
冲突。里德尔:我们如何确保日历处于有效状态

在不丧失一般性的情况下,我们可以掷硬币来决定哪个命令先到达。我的硬币出现了尾巴,所以命令
B
首先到达

on scheduleMeeting(B):
    publish MeetingScheduled(B)
现在,会议
A
的命令到达。如果您的有效日历不允许冲突,那么您的实现需要如下所示

on scheduleMeeting(A):
    throw DomainException(A conflicts with B)
另一方面,如果你接受命令到达不影响结果的想法,那么你需要考虑另一种方法。或许

on scheduleMeeting(A)
    publish MeetingScheduled(A)
    publish ConflictDetected(A,B)
也就是说,对日历聚合进行建模不仅可以跟踪计划的事件,还可以跟踪已发生的冲突

另见:

我想知道如何使用DDD和CQR为日历建模。我的问题在于越来越多的事件

对于“长寿”聚合,最常见的答案是将其寿命分成几段。这方面的一个例子是会计师将在最后关停的临时账户

在您的特定情况下,可能不是“日历”,而是“二月日历”、“三月日历”,等等,在您的领域中,任何合适的粒度

我不确定我对DDD的确认是否正确。我认为关键是不允许模型进入无效状态

是的,但定义无效状态是一件棘手的事情。乌迪大汉提议

时间上的微秒差异不应该对核心业务行为产生影响

更简洁地说,先处理命令A,再处理命令B,会生成一个有效状态,然后也应该是先处理命令B,然后处理命令A

让我们选择“事件碰撞”示例。假设我们处理两个命令
schedulemeting(A)
schedulemeting(B)
,域模型理解
A
B
冲突。里德尔:我们如何确保日历处于有效状态

在不丧失一般性的情况下,我们可以掷硬币来决定哪个命令先到达。我的硬币出现了尾巴,所以命令
B
首先到达

on scheduleMeeting(B):
    publish MeetingScheduled(B)
现在,会议
A
的命令到达。如果您的有效日历不允许冲突,那么您的实现需要如下所示

on scheduleMeeting(A):
    throw DomainException(A conflicts with B)
另一方面,如果你接受命令到达不影响结果的想法,那么你需要考虑另一种方法。或许

on scheduleMeeting(A)
    publish MeetingScheduled(A)
    publish ConflictDetected(A,B)
也就是说,对日历聚合进行建模不仅可以跟踪计划的事件,还可以跟踪已发生的冲突


另请参见:

谢谢您的回答。你把日历分成几个月的想法对我来说似乎完全正确。我不确定我对DDD的确认是否正确。我相信关键是不允许模型进入无效状态——这意味着必须通过C知道所有自己的事件