在干净的架构中正确管理存储库
correct management of repository in clean architecture
虽然我真的很喜欢这个概念,但我对实现干净的架构还很陌生,但是,当我想到存储库实现时,我总是不确定。
例如:我总能找到这样的图表
在这些图中,存储库接口使用实体,而实体对任何事情一无所知。问题是我认为让实体意识到存储库接口可能更有用。我认为这不会违反控制反转原则,因为它们只是接口而不是实现。
示例(不是真正的代码或语言,因为在这种情况下语言并不重要):
Class StudentEntity:
important method: getMathGrade
Class MathClassroomEntity:
constructor(repository){
this.repo = repository
}
important method: getStudents(){
this.repo.getStudents()
}
important method: getAverageGrade(){
students = this.getStudents()
sum = 0
foreach student in students:
sum = student.getMathGrade()
return sum/students.length
}
如您所见,一个实体中的许多重要业务逻辑都与其他实体相关。
如果实体对回购一无所知(至少是接口)。
如何将这些方法放入我的实体中?
我应该让我的实体抽象吗?我觉得不太漂亮
我应该把这个业务逻辑放在我的用例中吗?这听起来更糟
为什么他们让 repo 接口使用实体而不是其他方式?有什么优势?
我知道很多,所以非常感谢
how can I put these methods in my entities?
您不需要将这些方法放入您的实体中。
用例查询存储库,存储库应该 return MathClassroomEntity
应该只包含学生。
class RepositoryImpl implements Repository {
public MathClassroom getMathClassroom(){
return new MathClassroom(getStudents);
}
private List<Student> getStudents(){
return .....;
}
}
因此 MathClassroom 只会知道学生
public class MathClassroom {
private List<Student> students;
public MathClassroom(List<Student> students){
this.students = students;
}
public double getAverageGrade(){
double sum = 0;
for(Student student : students){
sum += student.getMathGrade()
}
return sum / students.size();
}
}
易于测试并与存储库分离。
虽然我真的很喜欢这个概念,但我对实现干净的架构还很陌生,但是,当我想到存储库实现时,我总是不确定。
例如:我总能找到这样的图表
在这些图中,存储库接口使用实体,而实体对任何事情一无所知。问题是我认为让实体意识到存储库接口可能更有用。我认为这不会违反控制反转原则,因为它们只是接口而不是实现。
示例(不是真正的代码或语言,因为在这种情况下语言并不重要):
Class StudentEntity:
important method: getMathGrade
Class MathClassroomEntity:
constructor(repository){
this.repo = repository
}
important method: getStudents(){
this.repo.getStudents()
}
important method: getAverageGrade(){
students = this.getStudents()
sum = 0
foreach student in students:
sum = student.getMathGrade()
return sum/students.length
}
如您所见,一个实体中的许多重要业务逻辑都与其他实体相关。
如果实体对回购一无所知(至少是接口)。
如何将这些方法放入我的实体中?
我应该让我的实体抽象吗?我觉得不太漂亮
我应该把这个业务逻辑放在我的用例中吗?这听起来更糟
为什么他们让 repo 接口使用实体而不是其他方式?有什么优势?
我知道很多,所以非常感谢
how can I put these methods in my entities?
您不需要将这些方法放入您的实体中。
用例查询存储库,存储库应该 return MathClassroomEntity
应该只包含学生。
class RepositoryImpl implements Repository {
public MathClassroom getMathClassroom(){
return new MathClassroom(getStudents);
}
private List<Student> getStudents(){
return .....;
}
}
因此 MathClassroom 只会知道学生
public class MathClassroom {
private List<Student> students;
public MathClassroom(List<Student> students){
this.students = students;
}
public double getAverageGrade(){
double sum = 0;
for(Student student : students){
sum += student.getMathGrade()
}
return sum / students.size();
}
}
易于测试并与存储库分离。