【问题标题】:Domain Driven Design - Inheritance in ValueObjects领域驱动设计 - ValueObjects 中的继承
【发布时间】:2020-06-16 10:26:35
【问题描述】:
User <AggregateRoot>{
  name: String;
  paymentType: PaymentType;
}

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

【问题讨论】:

    标签: domain-driven-design aggregateroot value-objects


    【解决方案1】:

    上面的 PaymentType(ValueObject) 是否可以被这些 ValueObjects(Subclasses) - Credit、Cash、Check 继承?

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

    但我不清楚这就是你真正要问的问题。你的例子看起来有点像试图设计一个“联合类型”,也就是说你可以使用一个句柄来匹配不同的模式。

    Scott Wlaschin 在他的域建模功能幻灯片中提供了一个PaymentMethod union type 的示例。他在designing with types 上的博客系列使用其他示例更详细地描述了该技术。

    有一个域不变量表示,用户一次可以有一个 PaymentType。这应该进入 User(AggregateRoot) 还是 PaymentType(ValueObject) ?

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

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

    【讨论】:

    • 这 2 个链接很有用,感谢分享。您有任何替代解决方案来代替创建联合类型吗?另外,您在这里指的是哪本书(第 5 章和第 6 章)?
    • Eric Evans,领域驱动设计 (2003)。
    • 感谢@VoiceOfUnreason。除了创建联合类型之外,您还有其他解决方案吗?
    猜你喜欢
    • 2021-11-07
    • 2021-11-12
    • 2011-10-06
    • 2015-12-13
    • 2011-05-29
    • 2011-02-04
    • 2017-06-06
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多