DDD:状态 - 值对象还是实体?

时间:2016-12-11 10:13:48

标签: java entity domain-driven-design value-objects

我有状态

 public final class Status {

        private int code;

        public Status(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

似乎状态可以是值对象,因为具有相同代码的两个状态是相同的状态,但是状态可以由管理员添加,状态列表应该显示在用户界面中;

要在用户界面中提供状态列表及其名称,我还有其他包装类

public final class AvailableStatuses {
    private Status status;
    private String name;

    ...
}

public AvailableStatusesRepository {
    ...
}

您对此设计有何看法?我应该调整它并将状态作为实体并将名称字段放入其中吗?

3 个答案:

答案 0 :(得分:2)

您当前设计的简单答案是AvailableStatus是一个实体,而Status是一个值对象(VO),它基本上是AvailableStatus'的包装器。身份(它的代码)。

您的模型可能很好,但您应该意识到的一件事是您被迫提出不同的名称,一个描述实体,另一个描述VO。

那是因为你可能缺乏适当的有界上下文(BC)。您可以拥有维护/管理/设置BC,其中Status将是一个实体,而它将是任何下游环境中的VO。

答案 1 :(得分:0)

这应该是一个值对象,因为它被用作模型中元素的描述符。它们由它们的属性定义,它们的属性(即状态)决定了它们的身份。

答案 2 :(得分:0)

状态是一个值对象,应该包括名称而不仅仅是ID。这两个字段在使用上下文中都是不可变的(即,没有具有Status字段的项可以更改Status对象)。包装类是不必要的。

在您的管理应用程序的上下文中,状态可被视为实体,但需要注意的是,ID无法更改(对于具有合成ID密钥的实体而言,这不是一个特殊要求)