2011-09-13 5 views
1

Ncqrsを使用すると、発生したすべてのイベント(すべての集約タイプ)を再生し、ゼロからの読み取りモデル全体を再作成するためにこれらをデノーマライザでフィードする方法はありますか?Ncqrsは完全なReadModelを再作成します

編集:

私はより具体的なユースケースを提供するために良いことだけれども。私はこれをASP.NET MVCアプリケーションの内部に構築し、読み込まれたモデルで作業するためにEntity Framework(Code first)を使用しています。開発をスピードアップするために(そして私が怠け者であるため)、読み取りモデルが変更されると、データベーススキーマを再作成するデータベース初期化ツールを使用したいと考えています。次に、イニシャライザのシードメソッドを使用してそれらを再投入します。

答えて

1

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

これは、すべてのイベントを取得する方法があるため、MS SQLイベント記憶域を使用する簡単な作業でした。しかし、他のイベントストアについてはわかりません。

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

これはeventbus上のすべてのイベントをプッシュし、denormalizersは、すべてのイベントを処理します:

2

残念ながら、あなたのためにこれを行うためのものは何もありません(私はかなり長い間使用しているncqrsのバージョンを更新していませんが)。それはあなたが何をしたいのか正確に依存しているので、それをやるのはやや些細なことでもあります。応じて、関連するすべてのイベント

を取得するためにイベント・ストアへ

  • コール:

    私はそれを行うような方法は、(この時点まで、私は必要性を持っていなかった)になりますこれを実行しているのは、すべてのイベント、または1つの集約ルートのイベントだけか、1つ以上の集約ルートのイベントのサブセットです。

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

    • ストアの既存の1

    • の代わりに再作成された読み取りモデルもう一度イベントストアに電話して、逃した可能性のあるイベントを取得してください。

    • 新しいイベントが返されない限り、繰り返します。

    読み込みモデルデータベース全体をゼロから再作成する場合は、サービスを一時的にオフラインにするか、終了するまで新しいイベントをキューに入れることに注意してください。

    また、この問題にアプローチするにはさまざまな方法がありますが、アーキテクチャーやシナリオによっておそらく最適な方法が決まるでしょう。

+0

ありがとうございます。ええ、あなたが言及したように、それはすべて状況に依存します。私は私の質問を更新し、私がやったやり方の説明を提供しました。 –

2

私たちは、私は次のコードが実装されたすべてのイベントを再生するために、MsSqlServerEventStoreを使用しています。関数GetFirstEventIdFromEventStoreはイベントストアを照会し、イベントストアから最初のIDを返します(SequentialId = 1)

関連する問題