如何将业务逻辑重构为领域实体中的第三方服务调用?

How to refactor business logic to a third-party service call in a domain entity?

我有一个域实体 ProjectEstimate,它知道如何计算自己的估计货币金额。这是一个基于对象本身可用的许多固定值的简单计算。 Calculate 方法作为业务逻辑的一部分被调用,EstimateCost 字段更新为金额。没什么难的。

然而,现在计算逻辑的复杂性急剧增加,并且已经被第三方 HTTP API 调用所考虑,我正在努力弄清楚如何调用这个 API 不违反域的 "purity" 及其逻辑。

我很乐意采用双重调度方法来调用域服务,但即便如此,我仍然对我可以将调用第三方的逻辑放在哪里有疑问API。

I am struggling to figure out how to make calls out to this API without violating the "purity" of the domain and its logic.

我见过两种常见的模式。

它们的共同点是在 API 调用的语义及其实现之间创建了一个抽象边界。也就是说,我们要创建一个看起来像函数的外观;它需要一些值作为参数和 returns 一个值。

这种模式应该很熟悉,因为它类似于存储库模式,我们在存储库模式中呈现简单的 collection/cache 语义,并在外观后面隐藏大量持久性实现细节。

现在我们有了外观,它通常以两种方式之一使用。

"easy"方式是将外观作为参数传递给领域模型。就模型而言,它是"just"一个域服务,可以根据需要调用或不调用。

另一种方法是在应用程序组件中与外观进行交互;从域模型中读取函数参数,从外观中获取结果,并将该结果传递回域模型。您最终会得到更清晰的职责分离——领域模型知道该做什么,应用程序知道该怎么做。

Cory Benfield 关于 protocol libraries 的演讲是第二种方法的良好起点。

双重调度,例如使用 CalculationRequested 和 CalculationReceived 进行封装,通常是封装任何外部调用的方式。

在事件建模中,它由 "Todo list" 模式解释:https://eventmodeling.org/posts/what-is-event-modeling/#automation