15

我已经开始在 .Net 中创建一个测试应用程序,它使用 Greg Young 的 EventStore 作为 CQRS/ES 的后备存储。

为了便于加载完整的聚合,我保存到一个名为“agg-123”的流中。例如,对于 id 为 553 的产品聚合,将有一个名为“product-553”的流。然后对于“Order”聚合,流将被命名为“order-123”。

从事件的补液和保存来看,这很有效。

我现在正在尝试创建一个侦听器,它将侦听某些流,然后填充查询数据库。我看到的订阅方法似乎只能订阅“order-123”或“all”。我看不出我将如何订阅“产品-”或“订单-”,或两者兼而有之。

我想要么

  • 我错过了流名称的重点,并且将它们命名错误
  • 错过了选择它的方法,例如“product-*”
  • 预计会订阅“全部”并过滤掉您不感兴趣的内容,尽管这会产生问题,即它也会发送所有“统计”事件

任何人有什么建议吗?

4

3 回答 3

11

在您的预测中,您可以使用 fromCategory()。EventStore 按流的名称对每个流进行分类,直到第一个“-”。因此,您的“order-123”和“order-456”流都属于“订单”类别。

因此,您可以执行以下操作:

fromCategory('order')
  .whenAny(function(s,e) {
    linkTo('orders',e);
  });

这会将所有订单聚合中的所有订单相关事件投射到您可以订阅的单个“订单”流中。

您需要确保类别预测正在运行。(自从我使用 EventStore 已经有一段时间了,它在投影处于测试阶段并且默认情况下未启用时又回来了,不确定最新版本中是否相同)

于 2016-01-13T06:34:09.207 回答
5

您需要检查投影是否正在运行,因为在撰写本文时默认禁用此功能,因为投影功能仍处于测试阶段。

有一种特殊类型的投影,称为类别投影,您可能需要它。如果您有按照name-id模式命名的流,例如product-123product-234您可以订阅$ce-product流以接收保存到这些流中的所有事件。

于 2016-02-22T14:00:59.340 回答
5

来自创建流文章的成本:

通常,当人们只想要几个流时,因为他们想以某种方式为特定类型的阅读器读出内容。这可以通过其他方式完成。在内部,事件存储本质上是一个基于主题的发布/订阅。您可以做的是利用投影重新分区您的流,以帮助为特定的读者提供服务。例如,假设读者对所有 InventoryItemCreated 和 InventoryItemDeactivated 事件感兴趣,但对系统中的所有其他事件不感兴趣。当我们在数百万个流中拥有事件时,仍然可以支持这个流。

为此,我们将创建一个投影来重新索引流。

所以这个想法是你可以创建两个投影来向一些productsorders流发送事件。

在同一篇文章中提到了系统按类型投影,它为每个事件类型创建一个名为 的流$et-{typename}。这在您的情况下也可能很有用。

例如,如果您只对观察聚合的创建感兴趣,则可以订阅相应的流。假设您有一些productCreatedorderCreated事件,您只需订阅$et-productCreated$et-orderCreated事件。从这些流中接收事件后,您还可以通过使用来自事件的来订阅各个流(例如product-553order-123)。Id*Created

(注意:投影默认情况下是禁用的,一旦启用,您可能需要手动启动按类型投影。)

于 2016-01-12T17:38:41.693 回答