DDD-如何在单个请求中修改多个AR(来自不同的有界上下文)?

时间:2018-07-04 11:12:52

标签: domain-driven-design event-sourcing

我想揭露一个仍处于书面状态的小场景,就DDD原理而言,要完成它有点繁琐。

比方说,我有一个用于托管帐户管理的应用程序。基本上,该应用程序包含多个有界上下文,例如Web帐户管理,Ftp帐户管理,邮件帐户管理...它们各自由自己的AR表示(它们可以独立存在)。

现在,让我们想象一下,我想为UI提供一种HTML表单,该表单为每个有界上下文组成一个字段集,例如,以更新限制和/或功能。我应该如何正确处理所有AR,而又不破坏每个请求的单个事务原理?我可以创建一种“外部” AR,比如说一个ClientHostingProperties AR,它可以保存对其他AR的引用,并使用自己的存储库将其作为单个事务的一部分进行更新吗?还是我应该更好地创建一个AR,该AR发出消息以让有限上下文提供的侦听器做出反应,在这种情况下,我可能应该考虑使用ES?

谢谢。

2 个答案:

答案 0 :(得分:2)

  

我应该如何正确处理所有AR,而又不破坏每个请求原则的单个事务?

您可能正在寻找process manager

基本草图:保留提交的表单中的详细信息本身就是一项交易(为您提供了积累业务价值的机会;第一步是捕获该机会)。

这为您提供一种跟踪此任务是否“完成”的方法:将任务中的更改与系统状态进行比较,然后发出命令(在隔离的事务中运行)进行更改

在我看来,过程最终看起来很像状态机。这些任务已完成,这些命令未完成,这些命令已失败:现在呢?并最终达到无需进行其他更改的状态,并且该过程的实例已“完成”。

答案 1 :(得分:1)

简短的回答:您不会。

集合是一个事务边界,这意味着,如果您要在一个“操作”中更新多个集合,则必须使用多个事务。总计等于一笔交易的原因是,这可以保证一致性。

这意味着您有两个选择:

  1. 您可以使集合更大。然后,您实际上可以保证一致性,但是处理并发请求的能力会变差。因此,通常这就是您要避免的事情。
  2. 您可以接受这是两次交易这一事实,这意味着您最终将保持一致。如果是这样,通常使用诸如流程管理器或流程之类的东西来处理更新多个聚合。在最简单的形式中,流程不过是简单的(如果发生此事件,请运行该命令规则)。以其更复杂的形式,它具有自己的状态。

希望这会有所帮助