40

コマンド、ドメイン モデル、ドメイン イベント、モデル DTO の読み取りなどのコンポーネントを備えた、CQRS にヒントを得たアーキテクチャがあるとします。
もちろん、ドメイン モデルで値オブジェクトを使用できます。私の質問は、それらが以下でも使用されるべきかということです:

  1. コマンド
  2. イベント
  3. DTO

上記のコンポーネントで値オブジェクト (VO) が使用されている例は見たことがありません。代わりに、プリミティブ型が使用されます。単純化した例にすぎないのかもしれません。結局のところ、DDD での VO の使用についての私の理解は、VO がアプリケーション全体の接着剤として機能するということです。

私の動機:

コマンド。
ユーザーが住所フィールドを含むフォームを送信したとします。この概念を表す Address Value Object があります。クライアントでコマンドを構築するときは、とにかくユーザー入力を検証する必要があり、整形式であれば、すぐに Address オブジェクトを作成して Command を初期化できます。Address オブジェクトの作成をコマンド ハンドラーに委任する必要はないと思います。

ドメイン イベント。
ドメイン モデルはすでに値オブジェクトの観点から動作しているため、イベントをプリミティブ型に変換する代わりに VO を使用して発行することで、マッピング コードを回避できます。この場合、VOを使用しても問題ないと確信しています。

DTO。
クエリ側の DTO に値オブジェクトを含めることができれば、柔軟性がいくらか向上します。たとえば、Money オブジェクトがある場合、それを EUR で表示するか USD で表示するかを選択できます。読み取りモデルを変更する必要はありません。

4

5 に答える 5

28

わかりました、気が変わりました。私は最近、多くの VO に対処しようとしてきましたが、このhttp://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnssonを見た後、いくつかのことが明確になりました。

コマンドとイベントはメッセージ (オブジェクトではなく、オブジェクトはデータ + 動作) であり、いくつかの点で DTO によく似ており、イベントに関するデータを通信し、それ自体は動作をカプセル化しません。

値オブジェクトは DTO とはまったく異なります。それらはドメイン表現であり、一般的に言えば、他のすべてのドメイン表現と同様に動作が豊富です。

コマンドとイベントは、それぞれドメインとの間で情報をやり取りしますが、それら自体は動作をカプセル化していません。その観点からは、コンテキスト境界内で VO を渡すのは間違っているように思われ、コンテキスト境界に違反する可能性があります。

Oren を言い換えると (彼は nHibernate と WCF について言及していましたが)、「ネットワーク経由でドメインを送信しないでください」。 http://ayende.com/Blog/archive/2009/05/14/the-stripper-pattern.aspx

値オブジェクトを伝達したい場合は、代わりにそれらの中で VO を再構築するために必要な属性を渡すことをお勧めします。

原文(後世のために):

値オブジェクトをドメイン モデルからイベントに渡すことができるのか、それともコマンドによって渡すことができるのかを尋ねている場合、前者には大きな問題は見られませんが、後者は集約ルートのルールの一部に違反する可能性があります。価値観の「所有者」。

つまり、値オブジェクトは色などの概念を表します。あなたは緑を持っていません、あなた緑であるかどうかです。これを渡すことでグリーンであることを伝えるコマンドには、本質的に問題はないようです。

Aggregate Root パターンに関する DDD の章を読むと、エンティティと値オブジェクトが非常によく説明されており、何度か読む価値があります。

于 2011-02-07T17:07:49.553 に答える
5

私はそれが悪い考えだと言います。

エンティティで同じことをしないのには理由があります。システムの他の部分をドメインに (間違った場所で) 結合するのを避けるためです。同じことが値オブジェクトにも当てはまります。値オブジェクトとエンティティの唯一の違いは、有効期間と所有権です。これらの違いは、それらを結合する方法と結合しない方法には影響しません。

イベントに VO を含めるとします。ドメインを変更するには、その VO を変更する必要があります。これで、イベントも変更を余儀なくされるコーナーに自分自身を閉じ込めてしまいました。これは、その一部であるコマンドまたは DTO についても同様です。

これは避けるべきです。

DTO やプリミティブを使用します。それらをマッピングします (AutoMapper はそれを 1 行の取引にします)。

于 2011-02-02T00:35:55.037 に答える
3

他の回答と同様に、SOA では、ドメインがリークしているため、サービスのカプセル化が壊れます。

于 2011-02-17T03:33:24.507 に答える