1

Ncqrsを使用して、これまでに発生したすべてのイベント(すべての集計タイプ)を再生し、読み取りモデル全体を最初から再作成するために、これらを非正規化ツールにフィードする方法はありますか?

編集:

より具体的なユースケースを提供するのは良いことですが。これをASP.NETMVCアプリケーション内で構築し、読み取りモデルを操作するためにEntity Framework(コードファースト)を使用しています。開発をスピードアップするために(そして私は怠惰なので)、読み取りモデルが変更されるとデータベーススキーマを再作成するデータベース初期化子を使用したいと思います。次に、イニシャライザのシードメソッドを使用してそれらを再設定します。

4

3 に答える 3

2

残念ながら、これを行うために組み込まれているものは何もありません(ただし、私が使用しているncqrsのバージョンはかなり長い間更新されていないため、おそらく変更されています)。それはあなたが何をしたいかに正確に依存するので、それをすることもやや自明ではありません。

私がそれを行う方法(この時点まで私は必要がありませんでした)は次のようになります:

  • イベントストアに電話して、関連するすべてのイベントを入手してください

実行している内容に応じて、これはすべてのイベント、1つの集約ルートのイベントのみ、または1つ以上の集約ルートのイベントのサブセットになります。

  • 読み取りモデルをメモリ内に最初から再作成します(遅くて不要な書き込みを節約するため)

  • 既存の読み取りモデルの代わりに、再作成された読み取りモデルを保存します

  • 見逃した可能性のあるイベントを入手するには、もう一度イベントストアに電話してください

  • 新しいイベントが返されなくなるまで繰り返します

注意すべき点の1つは、読み取りモデルデータベース全体を最初から再作成する場合、サービスを一時的にオフラインにするか、完了するまで新しいイベントをキューに入れることです。

繰り返しますが、この問題に取り組むにはさまざまな方法があります。アーキテクチャとシナリオによって、おそらくそれを行うための最善の方法が決まります。

于 2011-09-20T21:15:18.590 に答える
2

MsSqlServerEventStoreを使用して、次のコードを実装したすべてのイベントを再生します。

var myEventBus = NcqrsEnvironment.Get<IEventBus>();
if (myEventBus == null) throw new Exception("EventBus is not found in NcqesEnvironment");
var myEventStore = NcqrsEnvironment.Get<IEventStore>() as MsSqlServerEventStore;
if (myEventStore == null) throw new Exception("MsSqlServerEventStore is not found in NcqesEnvironment");
var myEvents = myEventStore.GetEventsAfter(GetFirstEventIdFromEventStore(), int.MaxValue);
myEventBus.Publish(myEvents);

これにより、イベントバス上のすべてのイベントがプッシュされ、非正規化機能によってすべてのイベントが処理されます。関数GetFirstEventIdFromEventStoreは、イベントストアにクエリを実行し、イベントストアから最初のIDを返します(SequentialId = 1の場合)。

于 2011-11-28T12:31:14.560 に答える
1

私がやったことは次のとおりです。サービスの起動時に、コマンドが処理される前に、読み取りモデルが変更された場合は、それを破棄し、非正規化装置で過去の​​すべてのイベントを処理して、最初から再作成します。これは、データベース初期化子のシードメソッドで実行されます。

すべてのイベントを取得する方法があったため、これはMSSQLイベントストレージを使用する簡単な作業でした。ただし、他のイベントストレージについてはよくわかりません。

于 2011-09-21T08:59:32.107 に答える