在干净的架构中正确管理存储库

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();
    }
}

易于测试并与存储库分离。