假设我有一个基于CQRS的系统,我的域需要来自外部Web服务的一些数据来做出决定。我该如何正确建模?
我可以想到两个选择:
命令处理程序运行域逻辑,域本身调用Web服务。一旦获得响应,它就会将适当的事件附加到当前聚合并存储它们。域名基本上“等待”Web服务返回。
命令处理程序运行域逻辑,域立即发出域内部所需的更多数据事件。进程管理器对此作出反应,与Web服务进行通信,对结果做出反应,并在前聚合上创建另一个命令,基本上是 continue 。
哪种方法“更好”,或者都是错误的,我应该采用完全独立的方式?基本上,我对选项1很好,因为我认为这基本上只不过是域内长时间运行的计算,但不知何故,“等待”的想法让我感到恼火。
我该怎么办?
答案 0 :(得分:7)
我倾向于像我对物理计算器那样考虑我的域名。它需要输入并产生输出。该输出可以作为事件存储或发出。因此,在数据中,会发生一些行为,而数据则会出现。所以非常关注行为。
您的选项(1)场景导致了几个关于将实体注入服务或存储库(或者,我认为是反腐败层)的DDD讨论。一般的共识是应该避免它,并且应该选择双重调度。关键是域然后需要更多信息,它需要最初传入或者需要获取。在我的计算器中类比,获取更多数据就像计算器提示您输入更多数据。
如果你使用选项(1),那么调用域的任何东西都需要处理任何网络呼叫失败才能重试。
如果你选择使用类似服务总线的选项(2),并且可能使用各种类型的流程引擎(例如saga或工作流),服务总线处理程序或流程引擎很可能会处理失败和重试。
我认为一种解决方案不一定比另一方更“好”,而是“不同”。我会选择你认为合适的任何东西,如果你有基础设施以某种方式处理失败/重试,那么我会选择那个基础设施最容易支持的选项。
希望有所帮助:)