projection 是一个函数,它接收域事件并将其转换为列表、树、图形等上的动作……
这里的想法是您希望语义域事件存储它们并能够重放它们,但是您需要对它们进行各种解释才能有效地查询它们。因此,您需要一个表示域事件 X 表示给定视图的 INSERT 或 UPDATE 或 DELETE 的投影。
因此,投影基本上是领域事件和 CRUD 操作之间的映射。您也可以说投影是对领域事件的多种解释之一。
现在,可能需要响应与更新表无关的域事件的操作。例如,每当您收到 userLoggedIn 事件时,您可能希望向用户发送电子邮件。这就像一个简单的 if this then that 规则。这基本上就是你所说的反应。您只需以某种自定义方式对域事件做出反应。
反应器(反应的组件)的结构因此与投影仪的结构非常相似。唯一的区别是反应器不会更新读取模型,而是执行任何您想要的任意操作。
换句话说:投影是一种特殊的反应,它总是关于更新读取模型。由于这很常见,因此您有一个专门的模式,但一般来说:每当您为响应接收事件而做某事时,这就是一种反应。
如果没有更多细节,如何实现反应器的问题很难回答。在wolkenkit,一个用于 JavaScript 和 Node.js 的 CQRS 和事件源框架,反应器只不过是流。流可以是stateless flows 或stateful flows,具体取决于它们是否包含自己的状态。
一个简单的例子(当然是专门针对 wolkenkit 的)可能如下所示:
'use strict';
const when = {
'userManagement.user.loggedIn' (event, mark) {
// ...
mark.asDone();
}
};
module.exports = { when };
(免责声明:我是 wolkenkit 的作者之一,所以请以一粒盐为例。)