如何在领域模型中识别聚合根

本文关键字:识别 领域模型 | 更新日期: 2023-09-27 18:24:56

在域驱动的设计中,我遇到了一个关于如何在域模型中识别聚合根的问题。

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

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. 任务仅存在于列表的上下文中

因此,List似乎是唯一的聚合根。(事实上,我的数据访问层只允许加载/保存List对象。)但是,我不知道如何将Task类上当前存在的UI干净地推送到List类上。目前,我的List类正在分发对Task对象的引用,允许调用者修改它们。

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

提前谢谢。

如何在领域模型中识别聚合根

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

如果任务或更新不会增长很多,那么一个聚合root(List)就可以了。

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

我认为识别聚合的最佳方法是事件风暴或用户故事映射。