“转移”一对多关联的业务流程

时间:2016-03-30 23:53:17

标签: domain-driven-design cqrs event-sourcing

域名简介

我有一个推销员。推销员获得BusinessOpportunity。在我的域名中,两者都是ARs。

有两种方法可以对此进行建模:

  1. 推销员聚合不知道其商机,或
  2. 推销员知道他的机会清单(当然使用OpportunityId)
  3. 我相信,BusinessOpportunity总是需要知道它的SalesmanId。

    问题

    我有一个业务流程,我计划使用Process Manager模式实现。这是一个“TransferAllBusinessOpportunities”流程。这意味着需要1个推销员并将他/她的所有机会“转移”给另一个。

    我们该怎么做?我们应该如何对域进行建模?

    如果我们将其建模为双向关联,我可以想到一个进程状态机,但它非常复杂。如果我们只有单向关联,我不知道怎么做,因为我们需要求助于读取模型来获取转移的商机列表,我担心我们应该保留所有内容侧模型。你怎么看待这个?

    非常感谢任何帮助。附上下图,以帮助可视化是否有帮助。

    business process

    快速总结问题:

    1. 你会如何解决这个问题?
    2. 您如何建模域名以最好地解决这个问题?
    3. 在命令处理程序中使用读取模型来执行业务流程是否可以?
    4. 再次感谢。

1 个答案:

答案 0 :(得分:3)

元答案:你需要阅读Greg Young对set validation所说的内容。您可以更好地与领域专家探讨您的要求。

  

如果我们只有单向关联,我不知道如何做,因为我们需要求助于阅读模型来获取商机列表

从读取模型中提取数据应该是您的第一手段。问题是什么?

基本大纲

  1. 查询集合
  2. 的读取模型
  3. 创建命令以根据集合
  4. 更新写入模型
  5. 将命令发送到写入模型
    • 写入模型从命令中获取所需的设置数据(不是来自读取模型)
  6. 第一个度假胜地不能满足您的要求,但它是思考用例的良好起点。如果实现这种简单方法可能会出现什么问题?这些问题会给企业带来什么损失?

    另外:我说过上面的表扬,但可能不是。你没有描述的一件事是这个模型的哪个部分决定"转移。是否允许模型拒绝转移机会的命令?在什么情况下?哪个聚合包含确定是否允许转移的状态?

    可能是转移不是被描述为一个命令,而是一个事件,描述了某个人类销售经理做出的决定。

      

    我担心我们应该把所有内容都保留在写入端模型中

    也许。是否存在需要状态集的业务不变量?到目前为止,它听起来并不像它,这强烈暗示该集合不属于写入模型。您希望尽可能地删除聚合,而不会失去强制执行不变量的能力。

      

    在命令处理程序中使用读取模型来执行业务流程是否可以?

    好吗"?从我在不同地方读到的内容来看,很多人都这么认为。就我个人而言,我并不相信。粗略地说,你正在看两个大纲

    1. 创建精简命令
    2. 将命令发送到命令处理程序
    3. 查询阅读模型以充实遗漏的详细信息
    4. 处理充实的命令
    5. VS

      1. 查询阅读模型
      2. 使用查询结果构建胖命令
      3. 将命令发送到命令处理程序
      4. 处理命令
      5. 我还没有看到一个例子,企业会关心这两种实现之间的区别;后一种实现更容易预测(您不需要了解读取模型的状态,只需要了解聚合的状态和命令的状态)。