如何在领域模型中识别聚合根
本文关键字:识别 领域模型 | 更新日期: 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; }
}
我可以声明以下关于模型:
- 更新仅存在于任务的上下文中
- 任务仅存在于列表的上下文中
因此,List似乎是唯一的聚合根。(事实上,我的数据访问层只允许加载/保存List对象。)但是,我不知道如何将Task类上当前存在的UI干净地推送到List类上。目前,我的List类正在分发对Task对象的引用,允许调用者修改它们。
这是否意味着Task也是一个聚合根,即使它的存在依赖于包含的List?
提前谢谢。
在我看来,在这种情况下,可以有1或2个聚合。这完全取决于你在列表中的任务是否很大;以及您的更新是否很大。
如果任务或更新不会增长很多,那么一个聚合root(List)
就可以了。
否则,您可以将它们分离为两个聚合root(List, Task)
,其中List
可以添加Task
,Task
可以添加Update
。
我认为识别聚合的最佳方法是事件风暴或用户故事映射。