2

純粋なDDDパラダイムからCQRSに移行しています。私の現在の関心事は、イベントソーシング、より具体的にはイベントストアの組織化です。私はたくさんのブログ投稿を読みましたが、それでもいくつかのことを理解できません。だから私が間違っているなら私を訂正してください。

各イベントは基本的に次のもので構成されます。-イベントの日付/時刻-イベントのタイプ(これからAggregateRootのタイプも把握できます)-AggregateRoot id(Guid)-AggregateRootバージョン(更新の順序を維持するため)-イベントデータ(一部更新に必要なデータを含むシリアル化されたクラス)

これで、イベントデータが単純な値型(int、strings、enumsなど)で構成されている場合、それは簡単です。しかし、別のAggregateRootを渡す必要がある場合はどうなりますか?AR全体をイベントデータの一部としてシリアル化することはできません(すべてのデータと遅延読み込みを考えてください)。基本的には、そのARのIDを保存するだけで済みます。ただし、そのイベントを適用する必要がある場合は、最初にデータベースからそのARを取得する必要があります。そして、私のドメインモデル(リポジトリを呼び出してAR IDを操作する)からそうするのは正しくないと感じています。

このための最良のアプローチは何ですか?

ps具体的な例として、タスクエンティティとユーザーエンティティ(両方のAR)で構成されるモデルがあると仮定します。タスクは、責任のあるユーザーへの参照を保持します。ただし、責任のあるユーザーは変更できます。

更新: 混乱の原因を見つけたと思います。イベントソーシングは、読み取りモデルの構築にのみ使用する必要があると思います。この場合、IDと生データを渡すことは問題ありません。ただし、アグリゲート自体で使用されるのと同じイベント。そして、これは理解できません。

4

3 に答える 3

3

DDDでは、集計は一貫性/不変の境界であるため、不変を維持するために別の集計に依存することはありません。この設計制限の使用を開始すると、他への完全な参照を保存する必要がある状況はほとんどありません。通常、そのIDと(必要な場合)バージョン、および関連する属性のコピーを保存します。

たとえば、通常のOrder / LineItemとProductの問題を使用して、完全な参照ではなく、LineItemに製品のIDと価格をコピーします。このようにして、製品の価格の変更がOrder/LineItem集計の不変条件に影響を与えるのを防ぎます。製品価格の変更後にLineItem価格を更新する必要がある場合は、使用済み製品からのPriceChangedイベントを追跡し、補償コマンドをOrder/LineItemに送信する必要があります。通常、この調整/同期はサガによって処理されます。

于 2011-07-08T09:54:07.037 に答える
0

イベントソーシングでは、集計の状態はイベントによって定義され、それ以上のものはありません。すべてのドメインモデルのもの(ala DDD)は、どのドメインイベントを発生させるかを決定するためだけにあります。イベントはドメインについて何も知らないはずです。単純なDTOである必要があります。実際、DDDなしでイベントソーシングを使用することはまったく問題ありません。

于 2011-07-08T14:33:49.820 に答える
0

私がイベントソーシングを理解しているように、それは人々がリレーショナルデータモデルとNHibernateやEntityFrameworkのようなORMを取り除くのに役立つはずです。それらはそれぞれそれ自体が科学だからです。そうすれば、プログラマーは単にビジネスロジックに集中することができます。ここで、イベントストアに使用されるいくつかのリレーショナルスキーマを確認しました。これらは、ID、バージョン、タイムスタンプに加えて、イベントペイロードをスキーマなしで格納するためのNClobまたはNVarchar(max)列でした。

于 2015-11-09T01:00:32.447 に答える