重播特定类型的事件

时间:2011-07-15 19:15:09

标签: cqrs event-store

我正在查看joliver's EventStore并考虑为新事件处理程序重播事件。我看到有一种方法可以获得自某个时间点以来的所有提交(ICommitStreams.GetFrom(Date)),但我无法弄清楚如何只获取特定类型的事件。

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

仅供参考,这就是我的工作:

var typesToSend = typeof (MyApp.Messages.Events.SomeAggregate.SomeEvent).Assembly
    .GetTypes()
    .Where(t => t.Namespace != null && t.Namespace.StartsWith("MyApp.Messages.Events.SomeAggregate"))
    .ToList();

var commits = eventStore.Advanced.GetFrom(DateTime.MinValue)
    .Where(c => c.Events.Any(e => typesToSend.Contains(e.Body.GetType())))
    .OrderBy(c => c.CommitSequence)
    .ToList();

正如Jonathan所说,提交可能包含多个事件,这将获得包含至少一个我正在寻找的事件的所有提交。要进一步过滤,您必须查看提交中的每个事件。

答案 1 :(得分:2)

EventStore本身并不特别关心提交的内容,这意味着它本身不会跟踪每个提交的单个事件类型。

这有几个原因。一个是简单性,另一个是支持几乎任何存储引擎的能力。我想保持设计非常简单,模型非常干净。此外,我希望避免对可能或可能不支持索引的底层存储引擎过于苛刻。如果您要查询特定类型,您已经假设底层存储引擎提供索引。由于EventStore与存储引擎无关,因此两者不会混合。

另一件事是“提交”实际上是一组或更多事件的集合。加载提交时,您将获得所有事件。

一种可能的解决方案是从一个时间点开始加载所有内容,然后忽略您不关心的事件。另一种解决方案是让订阅者监听来自EventStore的所有消息(异步/在另一个线程上)通过对事件类型进行适当的索引将消息推送到持久存储中。正确答案取决于您的性能要求。