代码之家  ›  专栏  ›  技术社区  ›  Seb

粒度域事件

  •  0
  • Seb  · 技术社区  · 6 年前

    最初我们使用域事件来处理与外部系统的通信。例如,每次用户更新他的电话号码或姓名时,我们都会发出一个更新的电话号码和一个更新的姓名事件。然后,这些被处理程序捕获并发送到其他系统。

        public void SetName(Name name)
        {
            if (Name == name) return;
            (...)
            RaiseEvent(new NameUpdated(Id, name));
        }
    
        public void SetPhoneNumber(PhoneNumber number, PhoneNumberType type)
        {
            RaiseEvent(new PhoneNumberUpdated());
        }
    

    只要我们不需要“聚合”事件,它就工作得很好。例如,我们有一个新的要求,要求我们在用户更新姓名和/或电话号码时发送一封电子邮件。在当前的结构中,我们的处理程序将收到多次通知(每个引发的事件一次),这将导致发送多封电子邮件。

    让我们的事件更通用似乎不是一个好的解决方案。但是,我们如何聚合一个事务中引发的几个事件呢?

    谢谢 SEB

    1 回复  |  直到 6 年前
        1
  •  0
  •   CPerson    6 年前

    我相信你的新要求与你的实际领域是分开的。您的域生成描述发生了什么的事件。另一方面,用户通知是将事件流投影到电子邮件表单中。就像您将阅读模型需求与您的域分开一样,您也应该将其分开。

    一个简单的解决方案是将您关心的事件捕获到一个表中,然后每天按计划发送一次,然后每个汇总发送一封电子邮件。

    推荐文章