集約ルートはクライアントによってロードされる唯一のオブジェクトであり、集約ルート内のオブジェクトに対するすべての操作は集約ルートによって行われることを理解しています。同じ規則により、集約ルートに対して定義された 1 つのリポジトリ インターフェイスが存在し、集約ルート内の任意のオブジェクトの永続化操作は、集約ルートに対応するこの「集約ルート リポジトリ」によって実行される必要があります。これは、集約ルートのサブオブジェクトに関連する操作のために、集約ルートオブジェクトのみを「集約ルートリポジトリ」に渡す必要があることを意味しますか?
例を挙げましょう。
School オブジェクトと Student オブジェクトがあるとします。Student は School なしでは存在できないため (学生は学校を辞めた可能性があると言うかもしれません。この場合、彼/彼女はもはや学生ではありません)、次のようになります。
class School
{
string SchoolName;
IList<Student> students;
}
class Student
{
string StudentName;
string Grade;
School mySchool;
}
ここでは School が集約ルートです。ここで、永続化操作用のリポジトリを定義するとします。
次のうち正しいものはどれですか?
1)
interface ISchoolRepository
{
void AddSchool(School entity);
void AddStudent(School entity); //Create a School entity with only the student(s) to be added to the School as the "students" attribute
}
2)
interface ISchoolRepository
{
void AddSchool(School entity);
void AddStudent(Student entity); //Create a Student entity. The Student entity contains reference of School entity in the "mySchool" attribute.
}
1) では、インターフェースで集約のみを公開しています。したがって、ISchoolRepository を実装する DAL は、学生を追加するために School オブジェクトから Student オブジェクトを取得する必要があります。2) はより明白に見え、1) を提案することで私は愚かに見えるかもしれませんが、純粋な理論における総根の概念は 1) を示唆します。