Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 依靠一个给定的集合';什么是事件来源的历史?_Domain Driven Design_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design 依靠一个给定的集合';什么是事件来源的历史?

Domain driven design 依靠一个给定的集合';什么是事件来源的历史?,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我目前正在处理一种情况,我需要根据我的合计是否是第一次出现这种情况(购买订单)来做出决定 我可以用两种方法解决这个问题: 在我的集合中引入一个字段,说明是否曾经购买过订单(或者可能是购买订单的数量) 在聚合的历史记录中查找任何OrderWasBuyed事件 选项2是否可以接受?出于某种原因,我认为选项1)适用于一般情况,更安全/更清洁,但我缺乏这些方面的经验 谢谢,两人都有效地做了同样的事情:表明订单已购买的字段需要以某种方式水合。基本上,这将作为重播的一部分来完成,这基本上并不意味着什么,而是

我目前正在处理一种情况,我需要根据我的合计是否是第一次出现这种情况(购买订单)来做出决定

我可以用两种方法解决这个问题:

  • 在我的集合中引入一个字段,说明是否曾经购买过订单(或者可能是购买订单的数量)
  • 在聚合的历史记录中查找任何OrderWasBuyed事件
  • 选项2是否可以接受?出于某种原因,我认为选项1)适用于一般情况,更安全/更清洁,但我缺乏这些方面的经验


    谢谢,两人都有效地做了同样的事情:表明订单已购买的字段需要以某种方式水合。基本上,这将作为重播的一部分来完成,这基本上并不意味着什么,而是当发生
    orderwasweed
    事件时,将设置该字段

    所以,如果你看这个场,或者你看这个事件的存在,这没有任何区别。至少在事关有效结果的时候,这没有什么区别

    谈到效率,使用场地可能是更好的主意,因为这样场地就会在重播过程中得到水分,而重播无论如何都需要进行。因此,您不必再次搜索事件列表,只需查看字段中的(缓存)值即可

    所以,说到底,长话短说:没关系。使用你感觉更好的东西。如果聚合的历史记录变得冗长,那么在性能方面,您最好使用field方法


    PS:当然,这取决于如何加载聚合的实现——聚合是否能够访问自己的事件历史记录?如果不是,那么在重播聚合时设置字段是您唯一的选择。请注意,聚合没有(也不应该!)访问基础存储库,因此它无法自行加载其历史记录。

    只要用例不需要聚合的先前状态,选项2就有效。重播事件只会恢复只读状态,如果当前命令不关心它,搜索某个事件可能是一个有效的简单解决方案

    如果您有“破坏封装”的壮举,则此问题可能不适用。事件源和聚合主要是概念,它们没有强加特定的OO方法。事件存储包含以事件流表示的业务状态。您可以随时读取它并将其用作不可变的集合。只有在需要恢复某个复杂状态时,我才会重播事件。但在这里的例子中,更简单的“has event”解决方案封装为服务应该可以很好地工作


    也就是说,总是重播事件以恢复状态并保留该字段并没有什么错。这主要是一个风格的问题,可以选择一致的做事风格,也可以调整它,以针对特定情况寻求最简单的解决方案。

    这在哪里可以依赖?在聚合本身还是在读模型/投影中?我在聚合上阅读,在应用程序的写端。这取决于实际实现,但是聚合如何查看自己的历史(它可以,但为什么)?补液时,它一次接收一个事件。最简单的解决方案是在购买第一份订单时(第一次在聚合上应用AnorderWasBund事件时)将标志设置为true。这不是在聚合级别,外部服务将访问存储库并查看聚合的历史记录。这将破坏聚合的封装。我会避免的。