在DDD中访问持久性的地方

问题描述 投票:1回答:1

我正在研究域驱动设计(是的,对于那个聚会我来晚了,到目前为止,我已经意识到域模型应该是宇宙的中心。数据持久性只是一个实际细节。

但是,如果这是真的,那么我就很难确定与渗透部分(例如存储库)的通信应该在哪里。

例如,如果我希望能够为学生添加新成绩,我应该像这样从学生领域模型内部调用存储库吗?

interface IGradeRepository
{
    void SaveGrade(int courseId, string grade);
    // ...other methods
}

class Student
{
    IGradeRepository _gradeRepository;
    List<Grade> _grades = new List<Grade>();

    public Student(IGradeRepository gradeRepository) 
    {
        _gradeRepository = gradeRepository;
    }

    int StudentId { get; set; }

    void AddGrade(int courseId, string grade)
    {
        var grade = new Grade(this.StudentId, courseId, grade);
        _grades.Add(grade);

        // Do I put the call to the data persistance here?
        _gradeRepository.SaveGrade(grade);
    }
}

如您所见,我最好的选择是从域模型内部访问存储库。但是,我不确定这是否是解决问题的方法。这似乎是许多教程中遗漏的内容之一。

因此总结:在进行域驱动设计时,我从哪里访问数据层?

c# domain-driven-design ddd-repositories
1个回答
0
投票

我应该这样从学生领域模型内部调用存储库吗?

这不是通常的模式。

相反,与存储库的交互更常见于应用程序层,而不是域层内。

存储库使应用程序可以访问聚合根,并且应用程序仅与聚合根进行交互。所以简单的模式看起来像

using transaction():
    Root root = _repository.get(rootId)
    root.doSomeCoolDomainThing(...)

这里的假设是,root可以在做一些很酷的事情的同时访问保持其域不变所需的所有持久化信息(这通常意味着整个信息图都可以在内存中使用。]]

在某些情况下,您会看到将根保存到存储库中变得更加明确:

using transaction():
    Root root = _repository.get(rootId)
    root.doSomeCoolDomainThing(...)
    _repository.save(root)
© www.soinside.com 2019 - 2024. All rights reserved.