(DDD)实体类可以包含哪些方法?

时间:2012-08-31 09:04:57

标签: c# domain-driven-design entity

我有一个应该作为实体类的类(如在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类的字典中。那是一个聚合,对吗?

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

或者这样就好了吗?

2 个答案:

答案 0 :(得分:4)

  

我主要担心的是,实体类是否可以包含方法,例如   吸气鬼和二传手?特别是像AddField这样的方法?

实体可以包含getter,setter,adders,behavior和业务规则(recommended)...基本上你想要的任何内容。

  

AddField方法接受IField类型的对象。我存储了那个   在Page类中的字典中。那是一个聚合,然后,   正确?

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

  

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

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

如果您想要使用DDD路线,我建议您阅读blue booksummary以便对该方法有基本的了解。 DDD有自己的原则和设计模式 - 如果你不采用整个范式或者至少得到它背后的意图,那么它们中的一些并不总是有意义的。

答案 1 :(得分:1)

我觉得你的班级看起来很好,你并没有像大多数人那样犯这样的男生错误,在这种错误中你有一个字典的吸气剂(所以你正确地封装和隐藏了字典)。

我假设你通过名称识别一个Page,这样就成了一个实体所需的id。

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

我不能说更多......看起来很好。