首页 > 解决方案 > 如何将业务逻辑重构为域实体中的第三方服务调用?

问题描述

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

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

我很乐意采用双重调度方法来调用域服务,但即使这样也让我对我可以将调用第三方 API 的逻辑放在哪里提出疑问。

标签: architecturedomain-driven-designcqrs

解决方案


我正在努力弄清楚如何在不违反域的“纯度”及其逻辑的情况下调用此 API。

我见过两种常见的模式。

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

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

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

“简单”的方法是将外观作为参数传递给域模型。就模型而言,它“只是”一个域服务,可以根据需要调用或不调用。

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

Cory Benfield 关于协议库的演讲是第二种方法的一个很好的起点。


推荐阅读