一般にアクセス可能な Web サイトを作成する際に、ドメイン駆動設計を使用しようとしています。私が抱えている問題の 1 つは、モデルの集約ルートがどうあるべきかを理解しようとすることです。私は、どのオブジェクトがエンティティ オブジェクトで、どのオブジェクトが値オブジェクトであるかについてかなり良い考えを持っています。
私のサイトは、ほとんどの公開サイトと同様に、すべてのユーザーがサイトに保存されているすべての情報を閲覧できるわけではありません。代わりに、自分が所有する情報しか見ることができません。私のサイトの場合、ユーザーは他のユーザーと共有できる「プロジェクト」を作成します。それでも、ユーザーは自分が作成したプロジェクトまたは参加を招待されたプロジェクトの情報しか見ることができません。私のモデルの他のすべてのオブジェクトはプロジェクト内に存在し、プロジェクトが削除された場合、それに含まれるすべてのオブジェクトも削除する必要があります。
これは、1 つのメインの「Project」集約ルート タイプと 1 つの「ProjectRepository」リポジトリを用意する必要があるということですか? サイトのページがリクエストされるたびにプロジェクト全体をロードするのは効率が悪いように思えます。実際には、要求されたプロジェクト内のアイテムのみを遅延ロードする NHibernate を使用しているため、これはそれほど問題ではありません。それでも、サイトの効率が遅延読み込みを伴う ORM の使用に大きく依存するようにするのは、悪い設計のように思えます。
これが、私の質問をより明確にすることを願っている更新です。
まず、プロジェクト タイプがモデルの集約ルートであるべきかどうかを理解しようとしています。プロジェクトは単独で存在できますが、レポートはプロジェクト内に存在する必要があります。プロジェクトが削除された場合、対応するレポートを削除する必要があります。これは、Project が集約ルートになる可能性がある、または集約ルートになる必要があることを意味しますか? これはよくわかりません。
プロジェクトが集約ルートの場合、レポートは正しくないはずですか? 私が理解しているように、ルートは DDD にネストされるべきではありません。さらに、リポジトリから取得できるのは集約ルートのみです。したがって、Report が集約ルートでない場合は、ReportsRepository を持つべきではなく、ProjectsRepository から取得したプロジェクトを介してのみ Report にアクセスする必要があります。そのため、ページが 1 つのレポートからのデータのみを必要とする場合でも、レポートを取得するには ProjectRepository からプロジェクト全体を読み込む必要があります。
さらに、プロジェクトがレポートを含む集約ルートである場合、ProjectRepository からプロジェクトを削除すると、含まれるレポートを削除するように設定することもできます。それでも、プロジェクトとレポートの両方が集約ルートである場合、プロジェクトが削除されたときに ProjectRepository がレポートを削除できないようにすると、集約間の境界が壊れますか? 集約ルートとそれに対応するリポジトリは、互いに独立して動作するはずではありませんか?