3

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

我错过了什么吗?

4

2 回答 2

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();

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

于 2012-09-24T12:19:22.320 回答
2

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

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

另一件事是“提交”实际上是一组一个或多个事件。当你加载一个提交时,你会得到所有的事件。

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

于 2011-07-16T01:14:26.477 回答