聚合不变量
Aggregate invariants
我不确定应该在哪里检查我的不变量...
例如,我有一个具有以下不变量的问题聚合:
- 问题的文本不能为空
- 问题的文本长度必须在 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);
}
}
QuestionId
和 QuestionText
是值对象。
在这种情况下,在聚合中我们可以明确地看到不变量。
但是,如果我们将不变逻辑推入 QuestionText
值对象,在聚合中我们将看不到那个不变...那么,最好的方法是什么?
如果您可以轻松地在值对象中实施不变量(例如“问题文本不能短于 100 个字符,也不能长于 500 个字符”),我建议您这样做。 Question
通过说 text
是 QuestionText
.
来继承不变量(以及来自 QuestionText
的所有其他变量)
我不确定应该在哪里检查我的不变量...
例如,我有一个具有以下不变量的问题聚合:
- 问题的文本不能为空
- 问题的文本长度必须在 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);
}
}
QuestionId
和 QuestionText
是值对象。
在这种情况下,在聚合中我们可以明确地看到不变量。
但是,如果我们将不变逻辑推入 QuestionText
值对象,在聚合中我们将看不到那个不变...那么,最好的方法是什么?
如果您可以轻松地在值对象中实施不变量(例如“问题文本不能短于 100 个字符,也不能长于 500 个字符”),我建议您这样做。 Question
通过说 text
是 QuestionText
.
QuestionText
的所有其他变量)