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

ジョナサンが述べているように、コミットには複数のイベントが含まれる場合があり、これにより、探しているイベントの少なくとも 1 つを含むすべてのコミットが取得されます。さらにフィルタリングするには、コミット内の各イベントを確認する必要があります。

于 2012-09-24T12:19:22.320 に答える
2

EventStore 自体は、何がコミットされるかを特に気にしません。つまり、それ自体では、各コミットの個々のイベント タイプを追跡しません。

これにはいくつかの理由があります。1 つはシンプルさ、もう 1 つはほぼすべてのストレージ エンジンをサポートできることです。デザインを極めてシンプルにし、モデルを非常にすっきりさせたいと考えました。さらに、インデックス作成をサポートしている場合とサポートしていない場合がある、基盤となるストレージ エンジンに過度の要求を課すことは避けたいと考えていました。特定の型に対してクエリを実行する場合は、基になるストレージ エンジンがインデックス作成を提供することを既に想定しています。EventStore はストレージ エンジンに依存しないため、この 2 つが混在することはありません。

もう 1 つのことは、「コミット」は実際には 1つ以上のイベントのセットであるということです。コミットをロードすると、すべてのイベントが取得されます。

考えられる解決策の 1 つは、ある時点以降のすべてをロードし、重要でないイベントを無視することです。もう 1 つの解決策は、EventStore から出てくるすべてのメッセージをリッスンするサブスクライバーを用意することです。サブスクライバーは、イベント タイプの適切なインデックスを使用してメッセージを永続ストレージにプッシュします (非同期的に/別のスレッドで)。正しい答えは、パフォーマンス要件によって異なります。

于 2011-07-16T01:14:26.477 に答える