2015-09-05 51 views
8

PluralsightコースDomain-Driven Design Fundamentalsには、集約の設計がどのように行われるかの例があります。 この例では、診療所での患者の予定が含まれています。予約は関係を有する。医師、または試験室に送付してください。 この例では、アポイントメントがDoctorとExamRoomの総ルートであってはならないとの分析が先行しています。 そして、設計進化の一歩は、DoctorとExamRoomオブジェクトへのオブジェクト参照を持つAppointmentから、これらの他のエンティティ(DoctorIdとExamRoomId)のプリミティブIDを保持することになります。 「オブジェクト参照ではなく関連概念のIDを含めるだけで、予定を作成したり変更したりすることで、予定を維持するときにシステムに与える影響は最小限に抑えられます」オブジェクト参照対DDD集計内のIDによる参照

私の最初の質問:これは共通のデザインパターンですか?私が正しく理解すれば、オブジェクトAがオブジェクトBに関係するが、Aで操作するとBを変更することは決してあってはならず、Bそのものではなく、そのIDで参照する必要があります。あなたがお勧めするものですか?

私の2番目の質問:これはDDDと関係がありますか?私はアポイントメントが医者の根源になるべきではなく、それがオブジェクト参照を保持できないということを意味しないか、何かが欠けているということですか?

+0

この前に同じ質問がありましたが、ヴォーンの3つのシリーズ集約的なデザインがある程度の光を放っていました。しかし、代替案を知るためにトピックを再訪し、いつルールを破ることが大丈夫ですか? –

答えて

5
  1. これは少なくともDDDユニバースでは一般的なデザインパターンだと思います。エヴァンスはDDDで述べている:

根が外のオブジェクトを使用すると、HibernateのようないくつかのORMを使用している場合

への参照を保持するために許可されていることをAGGREGATEの唯一のメンバーである、あなたは多分あるでしょうオブジェクト参照を持つ深くリンクされたオブジェクト構造に対処するために、遅延読み込みに対処する必要があります。一部の人は、遅延パターンの読み込みを遅延パターンとみなしています。

集計の概念をよりよく理解するために、this QAをご覧ください。個人的には、明確に定義された集約境界がアーキテクチャを改善すると確信しています。

  1. 集約境界を実装する場合、予定タイプは医師への直接のオブジェクト参照をほとんど持たないでしょう。

UPDATE: ヴォーンバーノンは、(部分IIを参照)約rules that spell out the current consensus view of DDD leaders on the style of aggregatesを語る:

[DDD] 1つの集約が 他の凝集体の根への参照を保持することができると述べています。しかし、これは を参照していないことに注意してください。 参照先の集約は、参照先の整合性境界内に配置してください。この参照は、ただ一つの全体集合体 の形成を引き起こさない。

彼は続けて:

あなたは、単一のトランザクションで複数のインスタンスを変更する場合、それ はあなたの一貫性の境界が間違っていることを強く示している可能性があります。 もしそうなら、モデル化の機会を逃す可能性があります。 ユビキタス言語のコンセプトはまだ手に入れていませんが、手を振ってあなたに叫んでいます(パートIを参照)。

私の理解では予定は医者のような他の集計の根に直接オブジェクト参照を保持するべきではありません。

+0

ありがとうございました。私はあなたが遅延読み込みに関して何を意味するのかを知る。私の気持ちは、ほとんどの場合、オブジェクト参照は必ずしも遅延ロードを必要としないということです。 Evansの引用について。私はそれを完全に得る。私が間違っている場合は私を修正しますが、それは私が思うところまでは実際にはありません。私の質問は、外部のオブジェクトがそれを保持できる場合ではなく、外部のオブジェクトへの参照を保持できるかどうかに関するものでした。あなたの引用は私が大丈夫です後者に対処します。しかし、例えば医者は集約されたルートですが、私の理解では、アポイントメントがその医者の参照を保持するのはいいです。 –

+1

しかし、プレゼンテーションでは、常に医者と部屋の名前が必要です。私はちょうど余分な読書モデルが多くの仕事であると感じる。それについての示唆? –