1

我有一个类应该作为一个实体类(如在 DDD 中)。它基本上看起来像这样:

public class Page
{
    protected String Name;
    protected String Description;
    protected Dictionary<int, IField> Fields = new Dictionary<int, IField>();

    protected Page SetName(String name)
    {
        this.Name = name;
        return this;
    }

    protected Page SetDescription(String description)
    {
        this.Description = description;
        return this;
    }

    public Page AddField(IField field)
    {
        this.Fields.add(xxx, Field); //xxx = just some id
        return this;
    }
}

现在我的问题是,这是一个有效的实体类吗?

我需要保持方法链接,所以请不要对此进行太多详细说明(即使您认为这是错误的)。

我主要关心的是,实体类是否可以包含方法,例如 getter 和 setter?尤其是像AddField?

AddField方法采用 类型的对象IField。我将其存储在课堂内的字典中Page。那是一个集合,对吗?

这不会改变实体的状态,使其不是真正的实体类吗?

或者它就是这样吗?

4

2 回答 2

5

我主要关心的是,实体类是否可以包含方法,例如 getter 和 setter?尤其是像 AddField 这样的方法?

一个实体可以包含 getter、setter、adders、行为和业务规则(推荐)......基本上任何你想要的。

AddField 方法采用 IField 类型的对象。我将它存储在 Page 类内的字典中。那是一个集合,对吗?

不,它可能是聚合,但不一定。这取决于您的上下文以及您如何设计聚合。见http://dddcommunity.org/library/vernon_2011

这不会改变实体的状态,使其不是真正的实体类吗?

改变状态是实体的本质,这就是为什么我们给他们 ID 来跟踪变化。另一方面,可以将值对象设置为不可变,因为它们的身份无关紧要,大多数情况下您不会修改值对象,而只是创建一个新对象。

如果您想走 DDD 路线,我建议您阅读蓝皮书摘要以对该方法有一个基本的理解。DDD 有它自己的原则和设计模式——当你不采用整个范式或至少不了解其背后的意图时,挑选其中的一些并不总是有意义的。

于 2012-08-31T09:58:58.157 回答
1

我认为您的课程看起来不错,并且您没有像大多数人那样犯小学生错误,其中您有字典的吸气剂(因此您正确封装和隐藏了字典)。

我假设您通过名称识别页面,因此它成为实体所需的 id。

关于什么是聚合。Page 类看起来像一个聚合根,因为您可以通过 Page 类控制对子项 (IField) 的访问。

我不能说更多……看起来不错。

于 2012-08-31T09:15:57.407 回答