gpt4 book ai didi

domain-driven-design - DDD - 聚合根和创建行为对象

转载 作者:行者123 更新时间:2023-12-04 11:45:45 28 4
gpt4 key购买 nike

我想就如何避免编写仅仅是数据容器的对象寻求一些建议。

考虑以下聚合根:

public class Post : IAggregateRoot
{
List<Comment> Comments {get; set;}
}

鉴于控制聚合根如何工作的原则,这样调用上述代码是否有效?
new Post().Comments.Add(New Comment("stuff"));

或者这是正确的方法?
public class Post : IAggregateRoot
{
List<Comment> Comments {get; private set;}
public void AddComment(string message)
{
Comments.Add(new Comment(message));
}
}

并像这样调用:
new Post().AddComment("stuff");

这就是 Eric Evan 所说的 Aggregate Roots 是原子的吗?

如果是这种情况,是否意味着实体没有任何公共(public) setter ,而是有支持的方法(AddThis、RemoveThat)?这就是您创建具有丰富行为的对象的方式吗?

最佳答案

您的聚合根的概念是正确的,但是您的两个选项实际上都是关于实现的——而且两者都是有效的。

选项 1

  • 优点:您的实体界面仍然存在
    很干净。
  • 缺点:Add方法需要逻辑
    把两者之间的关系联系起来PostComment (思考
    休眠)。你可以创建一个
    强类型集合和
    覆盖 Add 方法,或者你可以
    将事件返回到 Post
    处理。

  • 选项 2
  • 优点:Add/Remove方法为布线逻辑提供了一个方便的地方。
  • 缺点:随着集合属性数量的增加,您可能会出现 Add/Remove 的爆炸式增长。方法。此外,公开的集合必须是只读的,以确保 Comments总是使用特殊方法添加/删除。

  • 我的偏好是选项 1 - 我使用引发事件的通用集合。恕我直言,感觉更自然,其他开发人员更容易编写代码。尽管 SO 上的其他人表示不同。

    当我们谈论 行为 ,我们正在谈论附加 逻辑 给实体。例如。如果你想停止 Comments 5天后添加,你会问 Post如果添加 Comment是有效的, Post将包含进行检查的逻辑。

    关于domain-driven-design - DDD - 聚合根和创建行为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587174/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com