2011-07-13 6 views
9

私はコマンドとイベントの違いを理解していますが、多くの場合、本質的に同じ2つのクラス(ThingNameUpdateCommand、ThingNameUpdatedEvent)間の冗長性とマッピングに終わります。これらの単純なケースでは、イベントとしてコマンドとしても使用できますか?人々はすべてのコマンドとすべてのイベントをストアに連載していますか?ちょうど私に少し重複しているようです。イベント調達コマンドとイベント

答えて

12

この冗長性のすべての多くは、一般的に理由で、あなたはいくつかの理由のために2つの異なる目的のために同じメッセージを使用しないようにしたい:

  1. 彼らは彼ら以来、変更されたときにソースさのイベントがバージョン管理されなければなりません集計ルートを水和するときに格納され、再使用(デシリアライズ)されます。クラスがメッセージとしても使用されている場合、これは少し厄介なことになります。
  2. カップリングが増加し、同じクラスがコマンドハンドラ、ドメインモデルとイベントハンドラで現在使用されています。コマンド側をイベントから切り離すことで、あなたの生活を簡単にすることができます。
  3. 最後に明快さ。コマンドは、何かを実行するよう要求する言語で発行されます(一般的には必須)。イベントとは、何が起こったのか(過去の時制)を表します。あなたが両方のクラスに同じクラスを使用すると、この言語は混乱します。

これらは最終的にはデータクラスであり、「ハード」コードではありません。コードジェンのような単純なシナリオでは、実際にタイピングを避ける方法があります。たとえば、私はGregがXMLとXSD変換を使用して、過去に特定のドメインに必要なすべてのクラスを作成していることを知っています。

多くの単純なケースでは、これが実際にドメイン(つまりモデリングの振る舞い)であるのか、データだけであるのか疑問に思うかもしれません。データだけの場合は、ここでイベントソースを使用しないことを検討してください。以下は、Udi Dahanがあなたのドメインモデルを分割して、すべてがイベントソーシングを必要としないように話した話に似ています。私は今自分でこのように考えています。私は、コマンドが冗長であるという結論に来ているいくつかの例と、特にグレッグ・ヤング・プレゼンテーション(http://www.youtube.com/watch?v=JHGkaShoyNs)を通じて勤務した後

http://skillsmatter.com/podcast/design-architecture/talk-from-udi-dahan

1

。彼らは単にあなたのユーザーからのイベントです、彼らはそのボタンを押しました。これらのデータは、将来のビューで使用するかどうかわからないデータであるため、他のイベントとまったく同じ方法で保存する必要があります。あなたのユーザーは、そのアイテムを追加して後でバスケットから削除するか、少なくとも試みます。この情報を使用して、後でこのことをユーザーに思い出させることができます。

+0

私はこの方向にも傾いています。私は、あなたのイベントに仕事をするために必要なすべてのデータが含まれていることを念頭に置いて、特にそのデータが歴史的な表現をしていない外部システムから来るようにしたいという良い点について読んでいます。しかし、あなたは単にその良い習慣をコマンドにも適用することができます。特に、何か非常にDDDをしたいのであれば、コマンドやイベントの間に本当の違いはないはずです。その意図は明確で、ドメイン外の履歴データを含める必要があります。 – Arwin

+0

私はコマンドが冗長であるという意見はまだ残っています。私は、機能イベントソーシングをやっていることを呼びます。私の最近のブログESとF#エルムの完全なシステムとして:http://anthonylloyd.github.io/blog/2016/11/27/event-sourcing – Ant

+0

私の違いは、OOの代わりにFPを使用していると思う。 ESは自然な拡張可能なイベントスキーマである合計型で、FPに本当にうまく対応します。不変性はESにもよく合います。 – Ant

関連する問題