Eric Evan の Domain Driven Design ( http://domaindrivendesign.org/index.htm ) の意味では、最初に集合体について考える必要があります。次に、それらの周りにリポジトリを構築します。
互いに関連する集計を処理するための多くの手法があります。私が最も頻繁に使用するのは、読み取り専用インターフェイスを介してのみ Aggregate を相互に関連付けることを許可することです。Aggregate の背後にある重要な考え方の 1 つは、ルートを経由しないと基になるオブジェクトの状態を変更できないということです。したがって、製品とユーザーがモデルのルート集約である場合、ユーザー->注文->製品を経由して製品に到達した場合、製品を更新できません。製品リポジトリから製品を取得して編集する必要があります。(UI の観点からは、[ユーザー] -> [注文] -> [製品] に移動するように見せることができますが、製品編集画面を押すと、製品リポジトリからエンティティを取得します)。
User->Order->Product から Product を (コードで) 見ている場合、Product の基本的な状態を変更する方法がない (セットを取得しないなど) Product インターフェイスを見ているはずです。 )
アグリゲートとそのためのリポジトリを、使用方法によって整理します。User と Prodcut が独自の Aggregate であり、独自のリポジトリを持っていることがわかります。あなたの説明から、注文がユーザーに属しているのか、それともスタンドアロンであるべきなのかわかりません。
どちらの方法でも、集計が関連付けられている場合は読み取り専用インターフェイスを使用してください。ある集計から別の集計にクロスオーバーする必要がある場合は、独自のリポジトリから取得します。
リポジトリがキャッシュされている場合は、(ユーザーを介して) 注文をロードするときに、データベースから製品 ID のみをロードします。次に、製品 ID を使用して製品リポジトリから詳細を読み込みます。Order をロードするときに Product に他の不変条件をロードすることで、少し最適化できます。