5

集約ルートはクライアントによってロードされる唯一のオブジェクトであり、集約ルート内のオブジェクトに対するすべての操作は集約ルートによって行われることを理解しています。同じ規則により、集約ルートに対して定義された 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) を示唆します。

4

1 に答える 1

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. 
}

またはより厳密に

interface ISchoolRepository  
{     
 void AddSchool(School entity);    
 void AddStudent(string StudentName, string Grade); //without exposing Student type
}
于 2012-07-13T04:42:59.310 に答える