【问题标题】:Fat Domain Events or thin domain events胖域事件或瘦域事件
【发布时间】:2021-05-19 22:19:14
【问题描述】:

我对发布我的领域事件的最佳方法有疑问。我有两个用例:

  • 用户可以创建带有答案的问题
  • 用户可以为给定问题添加答案

其中一个不变量是:

  • 一个问题必须至少有 2 个答案,最多有 5 个答案。

我设计了一个聚合 Question 和一个 Answer 实体列表,我验证了它的 Question 构造函数不变量。

与第一个用例有关,我的疑问与我应该发布的领域事件有关。

我的第一个方法是这个领域事件:

public class QuestionCreated {
  private final String questionText;
  private final List<Answer> answers;
}

我对@9​​87654325@ 属性感觉不太好,因为它是Answer 实体的列表,但我不知道如何做得更好。

或者第二种方法,你会做两个域事件QuestionCreatedAnswerCreated,当我创建一个问题时,聚合将发布一个QuestionCreated 事件和一个AnswerCreatedanswers 列表中的每个答案?

对于第二个用例,添加问题的答案,遵循聚合原则,我将使用新答案保存 Question 聚合。在这种情况下,我也对要发布的域事件有疑问,QuestionUpdated,类似于QuestionCreated,或AnswerAdded,只有答案信息。

谢谢!

【问题讨论】:

    标签: events domain-driven-design


    【解决方案1】:

    由于一个问题不可能有零个或一个答案,我认为在Question(即QuestionCreated)的“创世纪”事件中至少包含两个答案会更好。否则,您将不得不模拟一个有零个或一个答案的原始问题,并确保永远不要将其视为Question

    对于添加答案案例,避免Updated 事件通常是一个好习惯,因为建模领域事件的主要价值在于它们表达了变化的上下文(例如“为什么”)除了改变了什么。 Updated 事件不捕获该上下文。所以我肯定会使用AnswerAdded 事件。

    我强烈考虑让QuestionCreated 事件有两个答案:

    public class QuestionCreated {
      private final String questionText;
      private final Answer firstAnswer;
      private final Answer secondAnswer;
    }
    

    如果在创建时提供了 3-5 个答案,则这些答案将作为 AnswerAdded 事件发出(或其他相同但名称不同以捕获上下文 AnswerCreated)。通过以这种方式对QuestionCreated 进行编码,我们确保无法用少于 2 个答案(“使非法状态无法表示”......我们将挥手离开 null)来表达创建事件,并且我们还允许至少有可能不分配List

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2021-07-25
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多