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

发布于 2025-01-06 10:47:34 字数 1075 浏览 1 评论 0 原文

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

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

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 对象。)但是,我看不出如何将 Task 类中当前存在的 UI 干净地推送到 List 类。目前,我的 List 类正在分发对 Task 对象的引用,允许调用者修改它们。

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

提前致谢。

Dabbling with domain driven design, I've run into a situation regarding how to identify aggregate roots within my domain model.

I have the following three classes, modelling a simple to-do list:

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; }
}

I can state the following about the model:

  1. An Update exists only within the context of a Task.
  2. A Task exists only within the context of a List.

List, therefore, would seem to be the only aggregate root. (Indeed my data access layer will only allow load/save of List objects.) However I can't see how I can cleanly push the UI that currently exists on my Task class, on to the List class. At the moment my List class is handing out references to Task objects, allowing the caller to modify them.

Does this imply that Task is also an aggregate root, even if it's existence is dependent on a containing List?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

和影子一齐双人舞 2025-01-13 10:47:34

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

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

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

In my opinion you can have either 1 or 2 aggregate in this cases. It's all depends your task in the list will be large or not; as well as your update will be large or not.

If task or update will not grow a lot, one aggregate root(List) will be fine.

Else you can separate them to two aggregate root(List, Task) where List can add Task and Task can add Update.

浪漫人生路 2025-01-13 10:47:34

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

I think best ways to identify your aggregates are event storming or user story mapping.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文