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