应用程序服务是否可以在DDD中的有界上下文中调用其他应用程序服务?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序服务是否可以在DDD中的有界上下文中调用其他应用程序服务?相关的知识,希望对你有一定的参考价值。
域事件是传播事件发生的好方法,以便以后可以发生其他事情。据我了解,在有界上下文中使用域事件非常棒。
假设我们正在创建像Stack Overflow这样的Q和A网站。有users
发布questions
,问题可以是closed
。
以下是此类应用程序中的一些可能命令:
- 问问题
- 关闭问题
- 禁止用户
域要求规定,如果禁止用户,则必须关闭所有问题。
当欺诈检测服务检测到用户是欺诈时,应该禁止用户并关闭他的所有问题。这个fraud detection service
可以调用ban user service
,而close all of user's questions
又称close all of user's questions
服务吗?
我们不想复制我们已经制作的所有“结束”逻辑。是否只建议调度“UserBannedEvent”等事件,并让监听器调用DetectFraudCommand
应用程序服务?或者可以打电话给另一个?
域事件是触发聚合副作用的好方法。它允许您通过分离职责来创建细粒度和分离的实现。也就是说,如果你想坚持DDD。
你可能会问“为什么不命令呢?”。好吧,你可以使用命令,但这种情况在语义上是错误的(在我看来)。命令是关于你想要发生的事情,但欺诈检测只是发生,你应该这样声明。
如果需要,您可以将命令作为副作用运行,由事件触发(注意不要过度设计)。
是否只建议调度像“UserBannedEvent”这样的事件,并让监听器调用close所有用户的问题应用服务?或者可以打电话给另一个?
- 你运行
fraud detection service
命令来检测欺诈 FraudDetectedEvent
生成ban user service
事件FraudDetectedEvent
由CloseQuestionsCommand
触发并调用close all of user's questions service
命令FraudDetectedEvent
禁止用户
这使得它松散耦合,并清楚地描述了业务逻辑。此外,它可以更好地扩展:你可以连接fraud detection service
的任何其他监听器,而无需接触link,如果直接运行命令,这是不可能的。
如果您需要事务一致性,它会变得更加棘手,但可以通过适当的事件调度程序设计来解决。
以下是Vaughn Vernon对聚合设计的一个很好的相关读物:qazxswpoi。
以上是关于应用程序服务是否可以在DDD中的有界上下文中调用其他应用程序服务?的主要内容,如果未能解决你的问题,请参考以下文章