DDD:如何使用域驱动设计解决这个问题?

时间:2017-08-18 00:58:15

标签: event-handling entity domain-driven-design event-sourcing aggregateroot

我是DDD的新手并且在接下来的练习中切齿。用例是真实的,但我用DDD解决它的尝试纯粹是为了学习。

  

我们有多个Git repos,每个包含一个我们调用的文件   产品规格系统需要通过克隆所有来响应HTTP POST   repos,然后更新那些匹配的产品规格   POST正文中的信息。系统还需要将POST请求记录为更新产品规范的原因。

我想使用Aggregates和事件采购来解决这个问题,因为它们似乎很合适。事件源自带有命令的自动持久性,因此如果我将POST主体转换为命令,我将免费获得审计。

问题是,POST可能符合多个产品规格。我不知道该怎么处理。我应该创建一个域服务,让它找到所有匹配的产品规范,然后向每个发布一个更新命令?或者我应该让聚合根这样做吗?如果使用聚合根来更新多个实体,它本身就需要是一个实体,那么它在我的问题域中会是什么呢?

2 个答案:

答案 0 :(得分:1)

对您的问题的第一条评论是正确的(@VoiceOfUnreason之一):这个'主要是副作用协调'。 但我会尝试回答你的问题:如何使用DDD /事件采购来解决这个问题:

  1. 第一个聚合根可以命名为:' MultipleRepoOperations'。此聚合根只有一个事件流。
  2. 触发整个过程的命令可以是:' CloneAndUpdateProdSpecRepos'其中包含要克隆和更新的所有回购列表。
  3. 当聚合根处理命令时,它只会吐出一堆类型为' UserRequestedToCloneAndUpdateProdSpec'
  4. 的事件
  5. 第二个有界上下文管理所有回购,并且它订阅了来自< MultipleRepoOperations'的所有事件。并将收到它发出的每个事件。这个有界的上下文聚合根可以被称为:' GitRepoManagement',并且每个repo有一个流。例如:GitRepoManagement-Repo1,GitRepoManagement-Repo215,GitRepoManagement-20158等。
  6. ' GitRepoManagement'接收类型' UserRequestedToCloneAndUpdateProdSpec'的每个事件,重放其相应的repo流以重新水化当前状态,然后尝试克隆和更新repo的产品规范。如果失败发出失败的事件,或者如果适当则发生升级。

答案 1 :(得分:0)

出于学习目的,尝试选择具有更复杂规则和逻辑的问题域,其中需要许多操作。例如小游戏(纸牌游戏,多人竞猜游戏或其他)。或模拟一些现实世界的过程,如学校管理或某些业务流程。