我有一个设计问题在我脑海中转过一段时间,我找不到一个好的解决方案。这是关于CQRS和域边界。
假设我有一个上下文,那就是为系统进行预订,以及事件。系统允许将单个预订链接到单个事件(已经完成,没有问题),并且每周预订链接到一系列事件。每周预订定义一周中的某一天(额外数据不相关);每周预订始终是开始和结束日(半年)。
系统还有两种类型的日子:正常日和非工作日,无法举行活动。
作为业务请求,用户希望每周一次的预订系统单独取消在非工作日举行的特定事件。
实际上,预订和事件存储在两个表中。如果事件存储有特殊标志,则会取消该事件。我没有与时间表的链接,因为我从未在我的业务环境中使用它。作为业务边界(与其他小数据相关,这里不相关),到目前为止,这个工作很有效。
这是我的问题:为了满足用户的请求(为每个删除的一天创建一个事件),我需要关于半年的所有日子的信息(只是在同一个工作日的那些就足够了)。但是,要获取此信息,我该如何处理?
我可能的解决方案:
哪种解决方案最好?
答案 0 :(得分:1)
Litmus测试:询问您的利益相关者是否曾发生过工作日变为非工作日,以及当天每周预订会发生什么。此外,是否曾经发生过非工作日成为工作日,以及那些天的预订会发生什么。
为每周事件创建一个事件监听器。创建每周事件时,它会加载非工作日列表(该半年的工作日)并触发一系列命令以取消特定日期。这将封锁边界,不会将额外数据添加到公共上下文中,并且为了额外的目的重用相同的代码(取消事件)。
根据我对你所写内容的理解,关闭。
在我看来,你真的有两种不同的聚合体;您有每周预订的定义,并且您有每日时间表来收集不同预订的活动。
当您创建预订时,您的输入是开始日期,结束日期,星期几,以及可能返回该范围内一周中的天数列表的域服务。考虑时间表或行程 - 我们正在确定此特定预订的候选日期。
您的事件监听器在看到新的预订时,会向该特定日期的日程安排聚合发出命令,并添加每日预订所请求的事件。由于时间表知道它是否是“非工作日”,它可以将每个事件标记为已安排或取消(如果您希望该信息是明确的;您可以将其隐含在工作日的状态中)在一些系统中)。
可以提前创建空计划,或者使用某些通用配方按需创建空计划,以确定它们是否处于工作日,并且如果它是您当前域的一部分,则可以支持更改自己的工作状态。
这里的关键想法是,非工作日是您的域模型的一部分,并且因为它们跨越多个预订对象,所以它们显然是位于预订聚合之外的实体。