域事件是传播事件发生的好方法,以便以后可以发生其他事情。据我了解,在有界上下文中使用域事件非常棒。
假设我们正在创建像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。