繁体   English   中英

胖域事件或瘦域事件

[英]Fat Domain Events or thin domain events

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

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

不变量之一是:

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

我设计了一个带有Answer实体列表的聚合Question ,并且我在Question构造函数中验证了该不变量。

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

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

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

我对answers属性感觉不好,因为它是一个Answer实体列表,但我不知道如何做得更好。

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

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

谢谢!

由于一个问题不可能有零个或一个答案,我认为总体上最好在Question的“创世纪”事件中包含至少两个答案(即QuestionCreated )。 否则,您将不得不 model 一个原始问题,它有零个或一个答案,并确保永远不要将其视为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM