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