我正在看joliver的EventStore,并考虑为新的事件处理程序重放事件。我看到有一种方法可以获得自某个时间点以来的所有提交(ICommitStreams.GetFrom(Date)),但我无法弄清楚如何仅获取特定类型的事件。
我错过了什么吗?
仅供参考,我是这样做的:
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所说,一个提交可能包含多个事件,这将获得包含至少一个事件的所有提交。要进一步过滤,您必须查看提交中的每个事件。
EventStore本身并不特别关心提交的内容,这意味着,它本身并不跟踪每次提交的单个事件类型。
这有几个原因。一个是简单性,另一个是支持几乎任何存储引擎的能力。我想保持设计非常简单,模型非常干净。此外,我希望避免对底层存储引擎的要求过高,这些引擎可能支持索引,也可能不支持索引。如果您要查询特定类型,那么您已经假设底层存储引擎提供了索引。由于EventStore与存储引擎无关,所以两者不能混合使用。
另一件事是,"提交"实际上是一组或多个事件。当你加载一个提交时,你会得到所有的事件。一个可能的解决方案是加载自某个时间点以来的所有内容,然后忽略您不关心的事件。另一种解决方案是让订阅者侦听来自EventStore的所有消息,该消息(异步/在另一个线程上)通过对事件类型进行适当的索引将消息推送到持久存储中。正确答案取决于您的性能要求。