我知道聚合根是客户端加载的唯一对象,聚合根中对象的所有操作都由聚合根完成。按照相同的约定,应该为聚合根定义一个存储库接口,并且对聚合根内的任何对象的任何持久性操作都应该由对应于聚合根的这个“聚合根存储库”完成。这是否意味着只应将聚合根对象传递给“聚合根存储库”以进行与聚合根的子对象相关的操作?
让我举个例子吧。
假设您有一个 School 对象和 Student 对象。由于学生没有学校就不能存在,(你可能会说一个学生可能已经离开学校,在这种情况下他/她不再是学生),所以我们有
class School
{
string SchoolName;
IList<Student> students;
}
class Student
{
string StudentName;
string Grade;
School mySchool;
}
学校是这里的总根。现在假设我们要为持久性操作定义一个存储库。
下面哪个是正确的?
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)