2016-06-22 9 views
1

時には、イベントが何を表すべきかを決定するのが難しい場合もあります。例えば、ここでは銀行口座の簡略化Ledgerです:イベントソースの適切なレベルのイベントは何ですか?

Ledger { 
    date : Date; 
    amount : Int; 
    cleared : String; 
} 

ユーザーが参照テキストを入力することにより、台帳をクリアします。または、ユーザーはテキストを空の文字列に設定してクリアを削除できます。

私の質問は以下のように、イベントソーシングと変更を追跡するとき、私は、ユーザーが何を意図し何のためにイベントを作成する必要があり、次のとおりです。

Event clearLedger(clearText : String) 
Event removeClearing() 

または私は背後に何が起こっているため、より汎用的なイベントを行う必要があります両方のケースで動作シーン:これは非常に基本的なCRUDのようなレベルにすべての方法を取ることができる

Event updateLedger(clearText : String) 

は、最終的にどのようなガイドラインがあり、データベースのトランザクション・ログ・レベルで終わりますここに?

答えて

2

コースの馬。イベントソーシングと変更を追跡するとき

私の質問は、私は、ユーザーがおそらく

を行うようにしています何のためにイベントを作成する必要があります。エンティティ境界自体の中では、それほど重要ではありません。外部からのその歴史を見て、イベントからの変化のコンテキストを認識できることは非常に便利なことがあります。ポップ/サブを考える。イベントを記述しているエンティティを取得したら、それらのイベントの購読を開始したいと思う可能性があります。

たとえば、顧客プロファイルのアドレスの変更を考えてみましょう。それは、以前のデータ入力(顧客の経験を改善するための矯正可能なシステム上の問題を探しているビジネスのエラー率を追跡する)や顧客の移転(この場合、新しい既存のポリシーに対して新しいアドレスを検討するために監査を開始する)。

すべてが単一のAddressChangedイベントの傘下にある場合、柔軟性が失われます。最良のケースでは、データだけから変化のコンテキストを推測しようとしています。

一方、その柔軟性によって価値が提供されない場合は、その必要はありません。

つまり、イベントソーシングCRUDは奇妙です。第一級市民としての変更を評価しない場合、なぜエンティティにエンティティがあるのでしょうか?集約状態の書き込みはずっと簡単です。

イベントの書き込みと集約状態の書き出しの違いは何ですか?

たくさんありません。それらを読んでもう少し異なっている。

控えめに言えば、集約状態を書き出すことは、集計が現在どのように表示されているのかに似ています。これは通常、現在の状態をDTOにシリアライズする持続性コンポーネントによって行われます。例えば、我々は後に、私たちは単に永続的ストアからJSON形式の文書を取得し、オブジェクトマッパーは仕事に行かせ台帳を再作成するにはJSONドキュメント

{ "date" : "2016-07-06" 
, "amount" : 40 
, "cleared" : null 
} 

Ledgerの現在の状態を表すことができます。イベントを言っているの歴史を、書き出す

は、後で台帳を再作成するには、より

[ { "event_type" : "LedgerCreated" 
    , "data" 
    : { "date" : "2016-07-06" 
    , "amount" : 40 
    } 
    } 
, { "event_type" : "LedgerCleared" 
    , "data" 
    : { "reason" : "Because I said so" 
    } 
    } 
, { "event_type" : "ClearingRemoved" 
    , "data" 
    : {} 
    } 
] 

見えるように起こっている、我々は永久的な店舗のうち、JSON形式のドキュメントを取得する必要があります、オブジェクトマッパーを使用して順序付けられた一連のイベントを作成し、最初の「シード」状態の元帳を作成してこれらのイベントを新しい元帳エンティティに再適用して、すべての変更を再生することにより、その歴史の中で。

+0

ありがとう、何かを明確にすることはできますか?イベントの書き出しと集約状態の書き出しの違いは何ですか? – ciscoheat

+0

@ciscoheatイベントソーシングの全体のポイントです。エンティティの最新の状態を保存するのではなく、イベントの完全な履歴を保存します。 VoiceOfUnreasonが意味することは、イベントがちょうど国家よりも豊富な情報を提供するということです。しかし、CRUDの文脈では、あなたが得るのは非常に一般的なCRUDイベントであるため、ESは過剰なものになる可能性があります。 – guillaume31

1

ビジネスエキスパートが使用する言語を教えてください。 UpdateLedgerを使用している場合は、これを使用します。彼らがLedgerClearedを使用する場合、それを使用します。

1

イベントはいくつかのビジネスオペレーションを表しており、それ自体が調べられ、分析される価値があります。たとえば、元帳のクリアランスを何回削除するかを確認することができます。これがあなたの望むものであれば、これはあなたのドメイン専門家が話していることです - そうしてください。 @VoiceOnUnreasonが書いたように、CRUDを実行したい場合は、イベントソースCRUDを使わないでください。本質的に、あなたはドメインイベントについて話すだけではないかもしれません。たとえば、集計メソッドclearLedgerおよびremoveClearanceによってどのような種類のドメインイベントが生成されますか。 2つの異なるビジネスオペレーションが同じイベントを発生させるのは奇妙なことです。

候補UpdateLedgerは、汎用LedgerUpdatedを生成します。その後数週間後に別の操作をUpdateLedgerに追加すると、NULL /空と多くのif文がチェックされているパラメータがたくさんある膨大な膨大なメソッドになります。これはおそらく、すべての基本的なDDDトーク/書籍/プレゼンテーションが悪いデザインの例として、最初の場所でDDDを行う理由は...

はこのようなものについての2つの簡単なルールがありますから始まる最初の例である:

  • コマンド、メソッド、およびイベントにCreate,UpdateおよびDeleteを使用すると、CRUDの匂いがします。 DDD
  • ifステートメントをコマンドハンドラakaアプリケーションサービスで実行すると、パラメータをチェックし、集約状態を変更する方法や呼び出す集約メソッドを決める方法が不十分な粒度、単一の責任原則の違反や懸念を解消
+0

良い答え、ありがとう、分析の部分についての良い点。ただ私がDDDをしていないことを明確にしたい。 – ciscoheat

+0

イベント調達はDDD –

+0

で手元にありますが、完全に相互依存しているわけではありません。私はDCIをシステムアーキテクチャに使用しています。 – ciscoheat

関連する問題