如何识别域模型中的聚合根?

时间:2012-02-16 16:11:31

标签: c# domain-driven-design aggregateroot

涉及域驱动设计,我遇到了如何在我的域模型中识别聚合根的情况。

我有以下三个类,为简单的待办事项列表建模:

public class List {
    private IList<Task> _tasks;

    public List() { ... }
    public string Name { get;  set; } }
    public IEnumerable<Task> Tasks() { ... }
    public void AddTask(string descr) { ... }
    public void RemoveTask(Task t) { ... }
    public Task GetRandomTask() { ... }
}

public class Task {
    private IList<Update> _updates;

    public Task(string descr) { ... }

    public string Description { get; }
    public bool IsClosed { get; }
    public IEnumerable<Update> Updates() { ... }
    public void AddUpdate(string descr, bool close) { ... }
}

public class Update {
    public Update(string descr) { ... }
    public string Description { get; }
}

我可以说明以下关于该模型:

  1. 更新仅存在于任务的上下文中。
  2. 任务仅存在于列表的上下文中。
  3. 因此,列表似乎是唯一的聚合根。 (事实上​​,我的数据访问层只允许加载/保存List对象。)但是我无法看到如何干净地将当前存在于Task类中的UI推送到List类。目前我的List类正在分发对Task对象的引用,允许调用者修改它们。

    这是否意味着Task也是一个聚合根,即使它的存在依赖于包含List?

    提前致谢。

2 个答案:

答案 0 :(得分:0)

在我看来,在这种情况下,您可以汇总1或2。这完全取决于您在列表中的任务是否很大。以及您的更新是否很大。

如果任务或更新不会增加太多,则汇总SELECT a.* FROM Assignment a JOIN Detail d ON a.ID = d.AssignmentID WHERE a.Class = 'GC' AND d.MondayOfWeekDate > '2018-03-26' AND d.Percent < 100; 就可以了。

否则,您可以将它们分为两个聚合root(List),其中root(List, Task)可以添加List,而Task可以添加Task

答案 1 :(得分:0)

我认为识别聚合的最佳方法是 event storminguser story mapping