假设堆栈溢出域问题和以下事件定义:
UserRegistered(UserId, Name, Email)
UserNameChanged(UserId, Name)
QuestionAsked(UserId, QuestionId, Title, Question)
假设事件存储的状态如下(按出现顺序):
1) UserRegistered(1, "John", "john@gmail.com")
2) UserNameChanged(1, "SuperJohn")
3) UserNameChanged(1, "John007")
4) QuestionAsked(1, 1, "Help!", "Please!")
假设以下问题列表的非规范化阅读模型(对于 SO 的第一页):
QuestionItem(UserId, QuestionId, QuestionTitle, Question, UserName)
以及以下事件处理程序(构建非规范化读取模型):
public class QuestionEventsHandler
{
public void Handle(QuestionAsked question)
{
var item = new QuestionItem(
question.UserId,
question.QuestionId,
question.Title,
question.Question,
??? /* how should i get name of the user? */);
...
}
}
我的问题是如何找到提出问题的用户的姓名?或者更常见:如果我的非规范化读取模型需要特定事件中不存在的额外数据,我应该如何处理事件?
我检查了现有的 CQRS 样本,包括Greg Young的SimpleSQRS和 Mark Nijhof 的Fohjin样本。但在我看来,它们仅使用事件中包含的数据进行操作。