【问题标题】:How to identify aggregate roots in domain model?如何识别域模型中的聚合根?
【发布时间】:2012-02-16 16:11:31
【问题描述】:

涉足领域驱动设计,我遇到了一个关于如何在我的领域模型中识别聚合根的情况。

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

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. Task 仅存在于 List 的上下文中。

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

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

提前致谢。

【问题讨论】:

标签: c# domain-driven-design aggregateroot


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多