域事件是传播已发生的事情的好方法,以便以后可以发生其他事情。据我了解,跨界上下文使用域事件非常好。
比方说,我们正在创建一个问与答站点,例如Stack Overflow。 users
中有questions
个帖子,问题可以是closed
。
在这样的应用程序中,有一些可能的命令:
域名要求指出,如果用户被禁止,则必须关闭所有问题。
当欺诈检测服务检测到用户是欺诈时,应禁止该用户并关闭其所有问题。此fraud detection service
是否可以调用ban user service
服务,而后者又称为close all of user's questions
服务?
我们不想重复已经完成的所有“关闭”逻辑。是否仅建议分派“ UserBannedEvent”之类的事件,并让侦听器调用close all of user's questions
应用程序服务?还是可以打电话给另一个人?
答案 0 :(得分:1)
域事件是触发聚合的副作用的好方法。它允许您通过划分职责来创建细化和分离的实现。也就是说,如果您要遵守DDD。
您可能会问“那为什么不命令呢?”。好了,您可以使用命令,但是这种情况在语义上是错误的(我认为)。命令是关于您想要发生的事情的,但是欺诈检测只是发生了,您应该这样声明它。
如果需要,您可以将命令作为副作用运行,并由事件触发(请注意不要过度设计)。
是否仅建议分派“ UserBannedEvent”之类的事件,并让监听器调用关闭用户所有问题的应用程序服务?还是可以打电话给另一个人?
DetectFraudCommand
命令来检测欺诈行为fraud detection service
生成FraudDetectedEvent
事件ban user service
由FraudDetectedEvent
触发并调用CloseQuestionsCommand
命令close all of user's questions service
禁止用户这使它松散耦合,并且清楚地描述了业务逻辑。而且,它的扩展性更好:您可以为FraudDetectedEvent
连接任何其他侦听器,而无需碰触fraud detection service
,如果直接运行命令则不可能。
如果需要事务一致性,它将变得更加棘手,但是可以通过适当的事件分派器设计来解决。
以下是沃恩·弗农(Vaughn Vernon)关于聚合设计的相关文章:link。