Events 胖域事件还是瘦域事件

Events 胖域事件还是瘦域事件,events,domain-driven-design,Events,Domain Driven Design,我怀疑发布我的域事件的最佳方法是什么。我有两个用例: 用户可以创建带有答案的问题 用户可以为给定的问题添加答案 其中一个不变量是: 一个问题必须至少有2个答案,最多有5个答案 我设计了一个聚合的问题,其中包含答案实体列表,我验证了该不变量 关于第一个用例,我的疑问与我应该发布的域事件有关 我的第一个方法是此域事件: public class QuestionCreated { private final String questionText; private final Lis

我怀疑发布我的域事件的最佳方法是什么。我有两个用例:

  • 用户可以创建带有答案的问题
  • 用户可以为给定的问题添加答案
其中一个不变量是:

  • 一个问题必须至少有2个答案,最多有5个答案
我设计了一个聚合的
问题
,其中包含
答案
实体列表,我验证了该不变量

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

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

public class QuestionCreated {
  private final String questionText;
  private final List<Answer> answers;
}
已创建公共类{
私有最终字符串文本;
私人最终答案清单;
}
我对
answers
属性感觉不好,因为它是
Answer
实体的列表,但我不知道如何更好地使用它

或者第二种方法,您是否会执行两个域事件
QuestionCreated
AnswerCreated
,当我创建一个问题时,聚合将为
QuestionCreated
列表中的每个答案发布一个
AnswerCreated

对于第二个用例,根据聚合原则,为问题添加一个答案,我将用新答案保存
问题
聚合。在这种情况下,我还对要发布的域事件有疑问,即更新了一个
问题
,类似于创建的
问题
,或仅添加了答案信息的
应答


谢谢

由于一个问题不可能有零个或一个答案,我认为在
问题
(即创建的
问题
)的“起源”事件中至少包含两个答案总体上更好。否则,您将不得不对一个没有或只有一个答案的原型问题进行建模,并确保永远不要将其视为
问题

对于添加答案案例,通常避免
更新的
事件是一种良好的做法,因为建模域事件的一个主要价值在于,它们除了表示更改的内容外,还表示更改的上下文(例如“为什么”)<代码>更新
事件不捕获该上下文。所以我肯定会使用
应答添加的
事件

<>我强烈认为< <代码>问题> <代码>事件有两个答案:

public class QuestionCreated {
  private final String questionText;
  private final Answer firstAnswer;
  private final Answer secondAnswer;
}
如果在创建时提供了3-5个答案,那么这些答案将作为
AnswerAdded
事件发出(或者以其他方式相同但名称不同的方式捕获上下文
AnswerCreated
)。通过以这种方式编码
QuestionCreated
,我们确保无法用少于2个答案来表达创建事件(“使非法状态不可表示”…我们将手动删除
null
),并且我们还允许至少不分配
列表的可能性