architecture - 如何将业务逻辑重构为域实体中的第三方服务调用?
问题描述
我有一个域实体 ,ProjectEstimate
它知道如何计算自己的估计货币金额。这是基于对象本身可用的许多固定值的简单计算。这Calculate
方法作为业务逻辑的一部分被调用,并且EstimateCost
字段随金额更新。那里没什么太难的。
然而,现在计算逻辑的复杂性急剧增加,并且已经被第三方 HTTP API 调用考虑在内,我正在努力弄清楚如何在不违反域的“纯度”及其逻辑。
我很乐意采用双重调度方法来调用域服务,但即使这样也让我对我可以将调用第三方 API 的逻辑放在哪里提出疑问。
解决方案
我正在努力弄清楚如何在不违反域的“纯度”及其逻辑的情况下调用此 API。
我见过两种常见的模式。
它们的共同点是在 API 调用的语义和它的实现之间创建一个抽象边界。也就是说,我们要创建一个看起来像函数的外观;它接受一些值作为参数并返回一个值。
这种模式应该很熟悉,因为它类似于存储库模式,我们在其中呈现简单的集合/缓存语义,并在外观后面隐藏一堆持久性实现细节。
现在我们有了外观,它通常以两种方式之一使用。
“简单”的方法是将外观作为参数传递给域模型。就模型而言,它“只是”一个域服务,可以根据需要调用或不调用。
另一种方法是与应用程序组件中的外观交互;从域模型中读取函数参数,从外观获取结果,并将该结果传递回域模型。您最终会得到更清晰的职责分离——领域模型知道该做什么,应用程序知道如何去做。
Cory Benfield 关于协议库的演讲是第二种方法的一个很好的起点。