帮助在提供的场景中选择我的DDD聚合根?

时间:2011-09-15 18:54:49

标签: c# asp.net domain-driven-design aggregate design-principles

我是DDD的新手,如果我缺乏一些知识,我已经阅读了一些关于这个概念的文章。我很好奇这个例子应该如何用聚合根建模。

基础是:有员工,会议和评论。每位员工都可以参加会议,他们可以在会议上发表评论。根据员工和会议跟踪评论。每个会议和员工都有唯一的标识符。

如果我想显示来自会议的所有评论,无论员工如何,我是否首先必须获得属于该会议的所有员工,然后对评论进行排序以仅显示与会议ID匹配的人员?

会议不能是我的聚合根,因为当我需要一份员工列表时,我当然不希望通过会议来获得它。也许每个人都是一个聚合根,但是评论在员工之外真的没有意义。我正在寻找有关如何更好地处理这种情况的想法。

// Datebase tables
Meeting
Employee
Comment - Contain EmployeeId and MeetingId


public class Employee
{
    public List<Comment> Comments { get; set; }
}

public class Meeting
{
    public List<Employees> Employees { get; set; } 
}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我可能会将其设计为

public class Comment
{
    public string Message {get;set;}
    public Employee {get;set;}
    public Meeting {get;set;}
}

public class Employee
{
    //public List<Comment> Comments { get; set; } <- why does this matter?
}

public class Meeting
{
    //public List<Employee> Employees { get; set; }  <- why does this matter?
    public List<Comment> Comments { get; set; } 
}

答案 1 :(得分:1)

员工和会议是您的聚合根,您必须为聚合根创建存储库。

评论可以是会议的财产。我认为从员工那里检索评论而不与会议相关是没用的?当你不知道它的“背景”(==会议)时,我认为评论没有任何意义吗?

通过这样做,你的班级模型将与Chris Marisic提出的非常相似。

在这些类旁边,您可以拥有以下存储库:

public class EmployeeRepository
{
    public IList<Employee> GetAll() {}
}

public class MeetingRepository
{
    public IList<Meeting> GetAll(){}

    public IList<Meeting> GetMeetingsAttendedByEmployee( Employee emp ){}
}