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

时间:2018-07-08 22:32:46

标签: design-patterns architecture domain-driven-design

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

比方说,我们正在创建一个问与答站点,例如Stack Overflow。 users中有questions个帖子,问题可以是closed

在这样的应用程序中,有一些可能的命令:

  • 问问题
  • 关闭问题
  • 禁止用户

域名要求指出,如果用户被禁止,则必须关闭所有问题。

当欺诈检测服务检测到用户是欺诈时,应禁止该用户并关闭其所有问题。此fraud detection service是否可以调用ban user service服务,而后者又称为close all of user's questions服务?

我们不想重复已经完成的所有“关闭”逻辑。是否仅建议分派“ UserBannedEvent”之类的事件,并让侦听器调用close all of user's questions应用程序服务?还是可以打电话给另一个人?

1 个答案:

答案 0 :(得分:1)

域事件是触发聚合的副作用的好方法。它允许您通过划分职责来创建细化和分离的实现。也就是说,如果您要遵守DDD。

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

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

  

是否仅建议分派“ UserBannedEvent”之类的事件,并让监听器调用关闭用户所有问题的应用程序服务?还是可以打电话给另一个人?

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

这使它松散耦合,并且清楚地描述了业务逻辑。而且,它的扩展性更好:您可以为FraudDetectedEvent连接任何其他侦听器,而无需碰触fraud detection service,如果直接运行命令则不可能。

如果需要事务一致性,它将变得更加棘手,但是可以通过适当的事件分派器设计来解决。

以下是沃恩·弗农(Vaughn Vernon)关于聚合设计的相关文章:link