【发布时间】:2013-05-20 12:04:25
【问题描述】:
让我们以通常的订单为例。假设有一个富域模型,我们有一个 Order.place() 调用。这些天似乎可以执行与此操作相关的其他任务 指向领域事件。因此,假设此调用触发了“OrderPlaced”事件。 放置事件后通常发生的事情是我们发送一封确认电子邮件,因此我们为此事件创建一个事件侦听器,并发送一封电子邮件。
很简单:Order.place() > 引发 OrderPlaced 事件 > EmailForOrderPlaced 侦听器触发 > 电子邮件被发送
我们也有类似的注册方式 (User.register() > UserRegistered 事件引发 > 注册监听器触发 > 电子邮件被发送)
但是:
问题(一个虚构的任务 - 不一定有意义 - 但是很多实际的业务需求无论如何都没有):
现在我们希望将注册 + 订单功能合二为一,与常规的每次注册一封电子邮件 + 一封订单电子邮件相反,我们只想发送一封包含两者的电子邮件。 这是一个严重的问题,因此通常我们会创建一个域服务来执行此操作,但是如果我们调用 User.register();订单.place();现在它将像往常一样触发 2 个事件, 通过电子邮件向客户发送垃圾邮件(好吧,不是真的,但这是一个示例)
那么我们如何解决这个问题呢? 显然,发送合并的电子邮件不是问题,因为我们可以在服务中为此引发事件,但这仍然给我们留下了原始的 2 封电子邮件。 如果我在执行 2 个调用之前分离服务中的 2 个侦听器,那实际上意味着我必须了解它们的功能,并且每次添加新的侦听器时,我都必须返回服务分离那个,等等,有没有更好的方法可以无缝地做到这一点?
【问题讨论】:
标签: oop domain-driven-design domain-model domain-events