【发布时间】:2019-10-03 11:26:26
【问题描述】:
我们有一个包含研讨会、参与者和他们的膳食的 DDD AppDomain。每个研讨会最多可容纳 1000 名参与者,每位参与者最多可享用 50 餐。我们决定研讨会、参与者和膳食是聚合体,以保持这些聚合体较小。 用户可以重新安排所有参与者的整个研讨会或重新安排单个参与者。所以我们有命令“RescheduleSeminarCommand”和“RescheduleParticipantCommand”。
当您重新安排研讨会时会出现问题:“RescheduleSeminarCommand”会导致“SeminarRescheduledEvent”,而“SeminarRescheduledEvent”会导致每个参与者出现“RescheduleParticipantCommand”。这意味着从存储库中加载每个参与者 - 所以 1000 个数据库请求。每个“RescheduleParticipantCommand”都会导致一个“ParticipantRescheduledEvent”,它会触发“RescheduleMealsCommand”,它会为每个参与者加载膳食——因此还有 1000 个数据库请求。
我们怎样才能减少数据库请求的数量?
1) 我们考虑使用 SeminarId 扩展“RescheduleParticipantCommand”和“RescheduleMealsCommand”,这样我们不仅可以加载一个参与者/餐点,还可以加载整个研讨会的所有参与者/餐点。
2) 另一种方法是创建额外的事件/命令,例如“RescheduleParticipantsForSeminarCommand”、“ParticipantsForSeminarRescheduleEvent”和“RescheduleMealsForSeminarCommand”等。
你觉得哪个更好? 1)、2) 还是我们没有想到的不同?
好的,我将提供一些我在第一次描述中遗漏的细节:
如果有以下类
class Seminar
{
UUID SeminarId,
DateTime Begin,
DateTime End
}
// Arrival/Departure of a participant may differ
// from Begin/End of the seminar
class Participant
{
UUID ParticipantId
UUID SeminarId,
DateTime Arrival,
DateTime Departure
}
// We have one Meal-Object for breakfast, one for lunch and
// one for dinner (and additional for other meals) per day
// of the stay of the participant
class Meal
{
UUID MealId,
UUID ParticipantId,
DateTime Date,
MealType MealType
}
用户可以
使用“RescheduleParticipantCommand”更改单个参与者的到达/离开,这也会将他们的用餐更改为新的日期。
使用“RescheduleSeminarCommand”更改研讨会的开始/结束,这会将所有参与者的到达/离开更改为新的开始/结束并相应地更改他们的膳食。
【问题讨论】:
-
乍一看,您的 Schedule bounded context 中的聚合设计似乎是错误的,但我需要扩展信息,了解每个命令执行中的哪些变化以及为什么要确认它,也许会给您一个有用的响应。你能用一个工作流示例来扩展这个问题吗?
-
感谢您的回复。我在描述中添加了一些细节。请参见上文。
-
谢谢,但您忘记发布最重要的信息:规则。每个参与者都可以拒绝到达/离开更改吗?那时发生了什么?您重新安排了一半的参与者,或者只是取消了整个研讨会的重新安排?吃饭也是同样的问题。
-
在等待回复时,我想向您指出一件事:命令是可能被您的域规则拒绝的东西。如果您因某个事件而发出命令(某事已经完成并且不能因为它通过所有域规则而被拒绝),请记住这一点;即使新命令因为被拒绝而什么也不做;您的系统必须处于一致的状态。基本规则:如果您引发事件是因为系统处于一致状态,即使该事件意味着系统中有更多命令可能被拒绝或不会改变系统中的任何内容。
-
好的。一些规则: - 如果我在 2019 年 6 月 1 日至 2019 年 6 月 5 日举行研讨会并将其重新安排到 2019 年 6 月 2 日至 2019 年 6 月 6 日,那么所有参与者都应在 2019 年 6 月 2 日到达于 2019 年 6 月 6 日出发,他们每天的膳食应相应更改 - 当我有一个参与者从 2019 年 6 月 3 日到 06/06/2019 并且我重新安排到 2019 年 6 月 4 日到 2019 年 6 月 6 日时膳食应相应改变
标签: domain-driven-design cqrs ddd-repositories domain-model