7

ユーザーがフォームで質問に答えるシステムがあります。このモデルを表すオブジェクトがありますが、DDDの観点からこれらのオブジェクトを整理する方法がよくわかりません。

  1. セクションのフォーム(独自のリストがあります)。
  2. セクション->(独自のリストがあります)グループ;
  3. グループ->(独自のリストがあります)質問;
  4. 質問->(独自のサブ質問のリストを持つことができます)質問;
  5. 質問->(独自のリストがあります)回答;
  6. Answer->(独自のリストがあります)Answer_Details;
  7. Answer_Detail->(サブ詳細の独自のリストがある可能性があります)Sub_Answer_Details。

すべてのオブジェクトには15を超えるプロパティがあり、それぞれが親なしでは意味がありません。DDDによると、フォームエンティティは集約ルートであり、他のすべてのオブジェクトは値オブジェクトである必要があると私は信じています。つまり、Formエンティティ専用のリポジトリが必要です。この場合、FormRepositoryは、子オブジェクトのすべての種類のCRUDメソッドで雑然としています。DDDに関して私の推論は正しいですか?非常に大規模な集計になってしまうのは問題ありませんか?そのような表現は、パフォーマンスの問題に簡単につながる可能性があると思います。

4

2 に答える 2

6

はい、DDD では深い階層は問題ありません。

非常に広範な集計になっても問題ありませんか? - 現実がそれほど複雑であり、ドメイン モデルが可能な限り最高のものである場合、複雑な集約ルートになってしまいます。

はい、Form集約ルートにする必要があります。

他のすべてのオブジェクトは値オブジェクトである必要があります-間違っています。他のすべてのオブジェクトは、それらを取得するためのリポジトリなしで、非集約ルート エンティティ (ID 付き) である必要があります。値オブジェクトには ID がありません。値オブジェクトの等価性は、ID の等価性ではなく、その属性値によってのみ決定されます (詳細はこちら)。

この場合、FormRepository は子オブジェクトのあらゆる種類の CRUD メソッドで雑然とします。いいえ、リポジトリには集約ルートに関するメソッドのみを含める必要があります。つまりGet<T> , Save<T> where T : IAggregateRoot、集約ルートのインスタンスを取得したら、属性とメソッドを介してトラバースして取得できます。何が必要。例:

var formId = 23;
var form = _formRepository.Get(formId);
var firstGroup = form.Sections.First().Group().First();

またはそれ以上

var groupIndex = 1;
var firstGroup = form.GetGroupAt(groupIndex);

どこ

public Group GetGroupAt(int groupIndex)
{
    Sections.First().Group().ElementAt(groupIndex);
}

このような表現は簡単にパフォーマンスの問題につながる可能性があると思います.CQRSを使用すると、コマンドハンドラーからドメインメソッドを呼び出すことFormになり、エンティティの永続化にNHibernateを使用すると、デフォルトで遅延読み込みが使用されForm、DBからのみ読み込まれます. 、そして実際に触れるエンティティのみをロードするため、たとえばSections.First()、DB からすべてのセクションをロードしますが、グループや残りはロードしません。クエリを実行するには、FormDto(データ転送オブジェクト) とその他のフラット化された dto を作成して、必要な形式でデータを取得します (エンティティ構造とは異なる可能性があり、UI が dto 構造を駆動する可能性があります)。DDD/CQRS/NHibernate/Repository に関する情報については、私のブログをご覧ください。

于 2012-11-30T15:35:51.043 に答える
5

回答は受け入れられましたが、2 セントを追加したほうがよいと思いました。

深い階層は (おそらく) 問題ありませんが、集約の背後にある考え方は実際にこれを防ぐことであることを覚えておいてください。私はエンティティを次のような集合体として考える傾向があります。

「この実体は、ARなしで何か意味がありますか?」

私はあなたのモデルに関するコンテキストを持っていないので、Order/を使用しますOrderLine。はOrderLineがなくても意味がありOrderますか? 注文明細行だけで何か (動作) を行うことはできますか? ここでの明白な答えは「いいえ」です。

各モデルは、コンテキストに基づいて処理する必要があります。しかし、所有権は必ずしも封じ込めを意味するわけではありません。

これらは、BC が正しく取得されていれば、別の境界付けられたコンテキストで作業するときに簡単に確認できる場合があります:)

あなたの場合、Answerがなければ意味がないかもしれませんQuestion。しかし、ある人が BC にQuestion住むことができQuestionBank、特定の質問があなたのExaminationBC とあなたのEnrollmentBC の両方で使用される場合があります。これらはすべて完全に構成されているため、コンテキストに依存します。

したがってQuestion、AR になる可能性があるケースの場合、AR が所有する質問はForm、単純な値オブジェクトまたは単純な QuestionId である可能性があります。

于 2012-12-04T04:34:17.297 に答える