CQRS とドメイン イベントの概念を使用したドメイン モデルでアプリケーションを構築しています (ただし、イベント ソーシングはなく、単純な古い SQL のみです)。SomethingChanged 系のイベントでは問題ありませんでした。次に、SomethingCreated イベントの実装に行き詰まりました。
ID主キーを持つテーブルにマップされるエンティティを作成すると、エンティティが永続化されるまでIDがわかりません。エンティティは永続性を無視するため、エンティティ内からイベントを発行する場合、ID は不明です。context.SaveChanges() を呼び出した後にのみ魔法のように設定されます。では、どのように/どこに/いつ Id をイベント データに入れることができますか?
私は考えていました:
- イベントにエンティティへの参照を含めます。これはドメイン内では機能しますが、イベント/メッセージによって通信する複数の自律システムを備えた分散環境では必ずしも機能しません。
- SaveChanges() をオーバーライドして、発行のためにキューに入れられたイベントを更新します。しかし、イベントは不変であることを意図しているため、これは非常に汚いようです。
- ID フィールドを取り除き、エンティティ コンストラクターで生成された GUID を使用します。これは最も簡単かもしれませんが、パフォーマンスが低下し、デバッグやクエリなどの他の作業が難しくなる可能性があります ( 、
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
いいえなど)。これは、多くのサンプル アプリケーションで見られるものです。MIN
MAX
- ハイブリッド アプローチ - ID はそのままにして、主に外部キーとより高速な結合に使用しますが、アプリケーションのリポジトリからエンティティをプルする一意の識別子として GUID を使用します。