聚合不变量

Aggregate invariants

我不确定应该在哪里检查我的不变量...

例如,我有一个具有以下不变量的问题聚合:

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

可能的聚合实现可能是:

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 通过说 textQuestionText.

来继承不变量(以及来自 QuestionText 的所有其他变量)