存储库模式 - 摘要信息

时间:2012-03-09 21:48:31

标签: c# domain-driven-design repository-pattern

我在Entity Framework中有以下实体:

public class School {
    public int Id { get; set; }
    public string SchoolName { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course {
    public int Id { get; set; }
    public int SchoolId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
    public virtual School School { get; set; }
}

public class Student {
    public int Id { get; set; }
    public string FullName { get; set; }

    public int Grade { get; set; }

    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
}
  • 每所学校都有很多课程
  • 每门课程只属于一所学校
  • 每个课程都有很多学生
  • 每个学生只属于一门课程

我的应用程序中有一个特定页面,需要总结一些您可以在此jsfiddle中看到的信息:http://jsfiddle.net/Jsf3f/

基本上我需要在汇总信息的表格中显示数据。我需要向每个学校展示自己的学校,其中所有课程的学生总数和所有课程的最高分。我还需要单独显示每门课程,并总结信息,包括注册的学生人数和课程中所有学生的最高年级。

为了做到这一点,我非常确定我需要创建可以汇总这些信息的新域类。

我的问题:

为了正确地总结这些信息,我将创建一个处理返回SchoolSummary对象的存储库。 SchoolSummary会被视为域驱动设计的集合根吗?

我是否尝试创建不同的域模型,并使摘要只是一个可以轻松将域对象转换为摘要的视图模型。

我认为我在尝试可视化域层与仅我的数据库层(实体框架)和表示层(MVC)时遇到了麻烦。

2 个答案:

答案 0 :(得分:1)

您在查看域图层时遇到问题,因为您没有任何域逻辑。 You should only use DDD when you need it。从您发布的内容来看,您似乎有一些贫血的实体。保持简单并抵制使用DDD的诱惑,除非您有复杂的业务逻辑。你会更开心。

对于SchoolSummary,这听起来像是一个消息(DTO,ViewModel等),您想要从查询中组合,然后一直到视图。好又简单。

希望这有帮助。

答案 1 :(得分:1)

说实话,您可以在应用程序的其余部分应用DDD,但在这种情况下,您只处理查询和报告。如果您正在使用CQRS(命令查询责任分离),那么基本上您可以创建一个简化的查询模型(视图模型本身的一部分)和一个将为它们提供服务的查询存储库。

因此不需要AR,只需为报告使用量身定制的存储库。关于DDD,IMO仅适用于命令(创建和更新模型),但是应用程序具有读取和写入功能,因此可以以更简单的方式处理不是“写入”的内容。最后,我们在应用程序中应用心态,我们不应强迫应用程序适应心态。