一些来源声称流程管理器不包含任何业务逻辑。例如,Microsoft文章就这样说:
“您不应该使用流程管理器来实现您域中的任何业务逻辑。业务逻辑属于聚合类型。”
他们还在更上面这样说(重点是我加的):
“值得注意的是,流程管理器不执行任何业务逻辑。它仅路由消息,并在某些情况下翻译消息类型。”
然而,我无法理解为什么消息之间的翻译(例如从域事件到命令)不是业务逻辑的一部分。你需要一个域专家才能知道正确的步骤顺序和它们之间的翻译。在某些情况下,你还需要在步骤之间保持状态,甚至根据一些(业务)条件选择下一个步骤。因此,并非所有事情都是给定步骤的静态列表(尽管我会把这个单独称为业务逻辑)。
在许多方面,流程管理器(或saga)只是另一种聚合类型,可以保持状态并具有一些业务不变量,我个人认为。
假设我们使用六边形架构实现DDD,我将把流程管理器放在应用程序层中(不是适配器!!),这样它就可以对消息做出反应或由计时器触发。它将通过存储库加载相应的流程管理器聚合,并调用其方法,以设置其(业务)状态或询问下一个要发送的命令(当然,实际发送由应用程序层执行)。此聚合位于域层中,因为它执行业务逻辑。
我真的不明白为什么人们区分业务规则和工作流规则。如果删除除领域层以外的所有内容,则应该能够重建一个可工作应用程序,而无需再次咨询领域专家。
我很乐意从你们那里获得我可能错过的进一步见解。
“您不应该使用流程管理器来实现您域中的任何业务逻辑。业务逻辑属于聚合类型。”
他们还在更上面这样说(重点是我加的):
“值得注意的是,流程管理器不执行任何业务逻辑。它仅路由消息,并在某些情况下翻译消息类型。”
然而,我无法理解为什么消息之间的翻译(例如从域事件到命令)不是业务逻辑的一部分。你需要一个域专家才能知道正确的步骤顺序和它们之间的翻译。在某些情况下,你还需要在步骤之间保持状态,甚至根据一些(业务)条件选择下一个步骤。因此,并非所有事情都是给定步骤的静态列表(尽管我会把这个单独称为业务逻辑)。
在许多方面,流程管理器(或saga)只是另一种聚合类型,可以保持状态并具有一些业务不变量,我个人认为。
假设我们使用六边形架构实现DDD,我将把流程管理器放在应用程序层中(不是适配器!!),这样它就可以对消息做出反应或由计时器触发。它将通过存储库加载相应的流程管理器聚合,并调用其方法,以设置其(业务)状态或询问下一个要发送的命令(当然,实际发送由应用程序层执行)。此聚合位于域层中,因为它执行业务逻辑。
我真的不明白为什么人们区分业务规则和工作流规则。如果删除除领域层以外的所有内容,则应该能够重建一个可工作应用程序,而无需再次咨询领域专家。
我很乐意从你们那里获得我可能错过的进一步见解。