web-dev-qa-db-ja.com

Add / Create *コマンドをCQRS +イベントソーシングアーキテクチャで処理する方法

イベントソーシングと一緒にCQRSパターンを使用して最初のアプリケーションを実装したいと思います。集約ルートの作成を適切に処理する方法を知りたいです。誰かがCreateItemコマンドを送信するとします。それはどのように扱われるべきですか?イベントItemCreatedはどこに保存する必要がありますか?新しいアイテムの最初のイベントとして?または、すべてのアイテムを集約するある種のItemListエンティティがあり、そのイベントリストはItemCreatedイベントのみで構成されている必要がありますか?

Udi Dahan 集約ルートを作成しないことをお勧めします で、代わりに常に何らかのフェッチメソッドを使用します。しかし、新しいものを取得し、IDが割り当てられていないことを確認するにはどうすればよいでしょうか。私は背後にある考えを理解しています。新しいオブジェクトは、そのイベントに応答するイベントがゼロで構成される状態を持つオブジェクトであると考えるのはかなり合理的です。しかし、どのように使用すればよいですか?私のリポジトリにはgetNewItem()のような明確なメソッドがあるべきですか、それともget(id)メソッドがOptional<ItemId>を受け入れるようにすべきですか?

編集:しばらく掘り進んだ後、アクターを使用して前述のパターンの 興味深い実装 を本当に見つけました。作成者は、アグリゲートを作成する代わりに、新しく作成されたUUIDを使用して、ある種のリポジトリからそれを取得します。このアプローチの欠点は、彼が一時的な不整合状態を許容することです。また、このようなアプローチでdeleteメソッドを実装する方法についても疑問に思っています。削除されたイベントを集計のイベントリストに追加するだけですか?

11
Mequrel

私が集めるように、ウディの投稿のアイデアは、何のアイテムも薄い空気の外に現れないということです。 (ほぼ)常に何か、より具体的には、何らかのドメイン操作があり、それによってアイテムが作成されました。ユーザーがサイトに登録している訪問者から実際に生まれているUdiの例のように。その時点で、その境界コンテキストでは、訪問者は集約ルートであり、彼のIPアドレスによって取得されます。次に、この訪問者は、Registerというドメイン操作を介して、この時点でユーザーである新しい「アイテム」を作成します。同じことが前のステップにも当てはまります。これは別の境界付きコンテキストです。リファラーはARであり、URLによって取得され、BroughtVisitorWithIpというドメイン操作があります、訪問者が生まれる場所。

Udiは削除についても非常にうまく書いています: http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ 。主なアイデアは、何も削除しないことです。キャプチャしたいドメイン操作は常に背後にあります。注文が削除されるのではなくキャンセルされるように。それを読んでください、それはとても良い投稿です。

DDDを実行し、特にイベントソーシングを実行する、両方のアカウントのここでの主要なポイントは、CRUD操作を直接行うべきではないということです。一部のデータを挿入、更新、または削除する必要が本当にあり、その背後にドメイン操作がない場合は、DDDとイベントソーシングは適切ではありませんその境界コンテキストの場合。単一の境界付きコンテキストが1つの原則に準拠している限り、これら2つを自由に組み合わせることができます。このようにして、CRUDスタイルの境界コンテキストがデータベースに行を作成し、それが別の境界コンテキストのエンティティおよび集約ルートになり、ARを取得して作成する必要がなくなります。

13