应用程序服务是否可以在DDD中的有界上下文中调用其他应用程序服务?

问题描述 投票:1回答:1

域事件是传播事件发生的好方法,以便以后可以发生其他事情。据我了解,在有界上下文中使用域事件非常棒。

假设我们正在创建像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应用程序服务?或者可以打电话给另一个?

design-patterns architecture domain-driven-design
1个回答
1
投票

域事件是触发聚合副作用的好方法。它允许您通过分离职责来创建细粒度和分离的实现。也就是说,如果你想坚持DDD。

你可能会问“为什么不命令呢?”。好吧,你可以使用命令,但这种情况在语义上是错误的(在我看来)。命令是关于你想要发生的事情,但欺诈检测只是发生,你应该这样声明。

如果需要,您可以将命令作为副作用运行,由事件触发(注意不要过度设计)。

是否只建议调度像“UserBannedEvent”这样的事件,并让监听器调用close所有用户的问题应用服务?或者可以打电话给另一个?

  1. 你运行fraud detection service命令来检测欺诈
  2. FraudDetectedEvent生成ban user service事件
  3. FraudDetectedEventCloseQuestionsCommand触发并调用close all of user's questions service命令
  4. FraudDetectedEvent禁止用户

这使得它松散耦合,并清楚地描述了业务逻辑。此外,它可以更好地扩展:你可以连接fraud detection service的任何其他监听器,而无需接触link,如果直接运行命令,这是不可能的。

如果您需要事务一致性,它会变得更加棘手,但可以通过适当的事件调度程序设计来解决。

以下是Vaughn Vernon对聚合设计的一个很好的相关读物:qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.