CQRS + Event SourcingアーキテクチャでのAdd / Create *コマンドの処理方法


11

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

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

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


1
Udiの役職は誤解を招く恐れがあります。私見では、彼の本当の目的は、新しく作られたARが常に他の場所から到達可能であり、新しいARを作成する必要があると判断した理由/方法/誰についてのコンテキストをキャプチャすることです。他のすべては、特定の実装(NHibernate?)が管理を容易にする方法に関するものです。
ダリエン

2
:あなたが特に参照しているのUdi漢の記事は、彼のアドバイスは、イベントの調達には適用されないかもしれないことを呼び出すことに注意してくださいudidahan.com/2009/06/29/dont-create-aggregate-roots/...
EZハート

回答:


13

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

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

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


2
「たぶん、DDDとイベントソーシングは、その限られたコンテキストに適していません。」DDDのポイントを正しく理解できます。それは悪魔の栄光のためだけにすべての場合に実装されるべきではありませんが、不確実な規則に満ちた複雑な領域に対処する必要がある場合にのみです。個人的には、要件がロジックに左右されない合法的なソフトウェアのためにやったことがあります。
イェゴールチュマコフ

2
この文だけに「その境界のあるコンテキストのために」 +1 :)
Songo

2
+1動詞「追加」と「作成」の使用は、古き良き表形式データベースとの相互作用の観点からドメインについてまだ考えていることを強く示唆しています。あなたのドメイン/境界コンテキストを知らなければ、これが適切かどうかは言えません。永続性を無視し、最初にドメインに固有のコマンドとイベント(別名INTENTIONSとOUTCOMES)に焦点を合わせてから、状態を永続化する方法を心配します。これは以前に数十万回解決された問題です。
マット

「動詞「追加」と「作成」の使用は、古き良き表形式データベースとの相互作用の観点からドメインについてまだ考えていることを強く示唆しています。大きな[何かを追加]ボタンがあるUIデザインがある場合、悲しいことにそれが意図です。文字通り新しいものを追加します。私は一般的にあなたに同意しますが、ここではデータベースレベルについて話しているわけではありません。AddまたはCreateが実際に使用する正しい単語である場合もあります。
デザイナー

1
@designermonkey UIにこれらのボタンがある場合、実際にはそれらの背後にドメイン操作がありますか?おそらく、しかし、10回のうち9回は、その限定されたコンテキストでの複雑なドメイン操作の必要はまったくありません。そして、純粋なCRUD操作は、純粋なCRUD操作であり、そのように処理する必要があります。ドメインモデルの複雑さが必要な場合にのみ使用してください。したがって、異なる設計原則を持つ異なる境界コンテキスト。
Tuukka・ハーパニエミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.