[英]Fat Domain Events or thin domain events
我怀疑发布我的领域事件的最佳方法是什么。 我有两个用例:
不变量之一是:
我设计了一个带有Answer
实体列表的聚合Question
,并且我在Question
构造函数中验证了该不变量。
与第一个用例相关,我的疑问与我应该发布的领域事件有关。
我的第一种方法是这个领域事件:
public class QuestionCreated {
private final String questionText;
private final List<Answer> answers;
}
我对answers
属性感觉不好,因为它是一个Answer
实体列表,但我不知道如何做得更好。
或者第二种方法,你会做两个域事件QuestionCreated
和AnswerCreated
,当我创建一个问题时,聚合将发布一个QuestionCreated
事件和一个AnswerCreated
为answers
列表中的每个答案?
对于第二个用例,添加问题的答案,遵循聚合原则,我将保存Question
聚合和新答案。 在这种情况下,我也对要发布的域事件、类似于QuestionUpdated
的QuestionCreated
或仅包含答案信息的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.