cqrsアーキテクチャで新しい集約ルートを作成するにはどうすればよいですか?この例では、最初の1つのAR1への参照を保持する新しい集約ルートAR2を作成します。
開始点としてAR1メソッドを使用してAR2を作成しています。これまでのところ、いくつかのオプションが表示されます。
- AR1の内部メソッドでは、リポジトリにアクセスできるドメインサービスを使用して、このオブジェクトをcreateAr2RootOpt1呼び出しnew AR2()てdb imediatellyに保存できます。
- 最初の集約ルートなどでイベントを発行できます。 - SholdCreateAR2Eventこれに反応してコマンド- CreateAR2Commandを発行するステートレスサガがあり、それが処理されて実際にAR2が作成されて放出され- AR2CreatedEventます。イベントソースを使用する場合、- SholdCreateAR2Event最初の集約ルートの状態には影響しないため、イベントストアに保持されません。(または、これをイベントストアに保存する必要がありますか?)- class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void handle(CreateAR2Command command){ //init this AR with values and save publishEvent(AR2CreatedEvent()); //used for projections afterwards and saved inside AR2 event store } } class Saga{ void handle(SholdCreateAR2Event ev){ emitCommand(new CreateAR2Command()); } }
これを行うためのより適切な方法はどれですか?
AR1WasCreatedですか?それでいいのAR2WasCreated?また、ロジックを使用する場合、AR2WasCreated実際に作成される前にイベントを発行しますか?また、このイベントをAR1のイベントログに保存すると問題が発生します。これは、実際にはこのデータをAR1内で必要としないためです(AR1内のデータは変更されません)。