领域驱动设计 - ValueObjects 中的继承

Domain Driven Design - Inheritance in ValueObjects

User <AggregateRoot>{
  name: String;
  paymentType: PaymentType;
}

PaymentType <ValueObject> {
  //Common attributes
}
  1. 上面的 PaymentType(ValueObject) 可以被这些 ValueObjects(Subclasses) - Credit, Cash, Check 继承吗?
  2. 有一个域不变量说,用户一次可以有一个 PaymentType。这应该进入 User(AggregateRoot) 还是 PaymentType(ValueObject)?

Can the above PaymentType(ValueObject) be inherited by these ValueObjects(Subclasses) - Credit, Cash, Cheque ?

也许吧。继承主要是一个实现细节。

但我不清楚你真正要问的是这个问题。您的示例看起来有点像尝试设计一个 "union type",也就是说可以用来匹配不同模式的句柄。

Scott Wlaschin 有一个示例 PaymentMethod union type in his domain modeling made functional slide deck. His blog series on designing with types 使用其他示例更详细地描述了该技术。

There is a domain invariant that says, User can have one PaymentType at a time. Should this go into the User(AggregateRoot) or PaymentType(ValueObject) ?

视情况而定。决定允许哪些状态转换的代码通常进入拥有状态的事物(在本例中为用户)。我们如何表示状态、实际数据结构等,通常存在于值对象中。

第 5 章(实体、值对象)和第 6 章(聚合、存储库)中描述的建模模式只是模式。最完美地应用这些模式没有奖励。实现域模型的主要目标仍然是相同的:生成可以平滑更改的代码设计以匹配域不断变化的需求。