我已经开始在.Net中创建一个测试应用程序,它使用Greg Young的EventStore作为CQRS / ES的后备存储。
为了便于加载完整聚合,我保存到名为" agg-123"的流中。例如,对于id为553的产品聚合,会有一个名为" product-553"的流。然后对于"订单"聚合,流将命名为" order-123"。
从补水和保存事件来看,效果很好。
我现在正在尝试创建一个侦听器,它将侦听某些流,然后填充查询数据库。我看到的订阅方法似乎只能订阅" order-123"或" all"。我无法看到我如何订阅"产品 - "或者"订单 - "或两者兼而有之。
我想是
有人建议吗?
答案 0 :(得分:5)
在您的投影中,您可以使用fromCategory()。 EventStore按流的名称对每个流进行分类,直到第一个“ - ”。因此,您的'order-123'和'order-456'流都属于'订单'类别。
所以你可以这样做:
fromCategory('order')
.whenAny(function(s,e) {
linkTo('orders',e);
});
这会将所有订单聚合中的所有订单相关事件投影到您可以订阅的单个“订单”流中。
您需要确保类别预测正在运行。 (自从我使用EventStore已经有一段时间了,当预测处于测试阶段并且默认情况下未启用时,它已经回来了,不确定最新版本中的内容是否相同)
答案 1 :(得分:4)
您需要检查投影是否正在运行,因为在撰写此帖子时默认情况下禁用此功能,因为投影功能仍处于测试阶段。
您可能需要一种名为类别投影的特殊类型投影。如果您拥有以sed
模式命名的流,例如name-id
,product-123
,则可以订阅product-234
流以接收保存到这些流的所有事件
答案 2 :(得分:2)
来自The cost of creating a stream article:
一般来说,当人们只想要几条流时,因为它们 想以特定的方式读出特定类型的东西 读者。这可以通过其他方式完成。事件存储内部是 essentialy基于主题的pub / sub。你能做的就是重新分配你的 流利用投影来帮助提供特定的读者。 作为一个例子,让我们说读者对所有人都感兴趣 InventoryItemCreated和InventoryItemDeactivated事件但不是 对系统中的所有其他事件感兴趣。支持这一点 当我们拥有数百万个流中的事件时,仍然可以流 完成。
为此,我们将创建一个投影来重新索引流。
因此,我们的想法是您可以创建两个投影来向某些products
和orders
流发送事件。
在同一篇文章中,提到了system bytype投影,它为名称为$et-{typename}
的每个事件类型创建了一个流。这也可能对您的情况有用。
例如,如果您只想观察聚合的创建,则可以订阅相应的流。假设您有一些productCreated
和orderCreated
个事件,您只需订阅$et-productCreated
和$et-orderCreated
个事件。在收到来自这些流的事件后,您还可以通过使用product-553
事件中的order-123
来订阅各个流(例如Id
和*Created
)。
(注意:默认情况下禁用投影,一旦启用,您可能需要手动启动bytype投影。)