聚合不变量

问题描述

我不知道应该在哪里检查我的不变量...

例如,我有一个带有以下不变量的 Question 聚合:

  • 问题的文本不能为空
  • 问题的文本长度必须在 100 到 500 个字符之间

我已经读过检查不变量的最佳位置是在聚合的构造函数中,但我也读过它会被推荐在值对象中推送域逻辑,例如。

一个可能的聚合实现可能是:

public class Question {
  private final id: QuestionId;
  private final text: QuestionText

  public Question(id: String,text: String) {
    // verify invariants
    ensureLengthText(text); // this method verifies the invariant    

    this.id = new QuestionId(id);
    this.text = new QuestionText(text);
  }
} 

QuestionIdQuestionText 是值对象。

在这种情况下,在聚合中我们可以明确地看到不变量。

但是,如果我们在 QuestionText 值对象中推送该不变逻辑,总的来说我们将看不到该不变......那么,最好的方法是什么?

解决方法

如果您可以轻松地在值对象中强制执行不变量(例如“问题文本不能短于 100 个字符或长于 500 个字符”),我建议您这样做。 Question 通过声明 QuestionTexttext 继承了该不变量(以及来自 QuestionText 的任何和所有其他变量)。