领域驱动设计;值对象是否可以包含不变量或规范?

3

我开始尝试使用领域驱动设计,并对值对象有一个问题:

它们可以包含不变量或其他规范吗?

考虑一个不可变的值对象

ValueObject (

  prop integer: Int
  prop string: String

  // Value and copy constructor

  // Observers for integer and string

  // Equality methods on integer and string value

)

我能否添加一些不变量,例如 整数 > 0 & < 42。或者它们必须是简单的传递而没有任何逻辑?

我希望能够这样做,但需要确认。

2个回答

5

值对象(VO)封装了一个值以及其业务要求。它的目的是:模拟一个业务概念(带有其限制条件),这个概念恰好是一个简单(不一定是单一)的值。

VO不是数据传输对象(DTO),因为它定义了一个仅在包含的有界上下文中有效的业务概念,而DTO旨在跨越边界。


2

值对象应该处理封装的数据不变量,或者至少是它们能够处理的尽可能多的部分。我倾向于采用以下做法,与实体类似,但有一个不同之处:

  • 构造函数应确保创建处于有效状态
  • VO的状态被封装,所有对其进行的更改都通过受控方法等完成
  • 由于值对象是不可变的,因此方法更改返回一个新的值对象而不是更新现有状态

让值对象拥有自己的业务逻辑真正有助于清理使用这些值对象的实体类中的代码。这在大型聚合/实体中可能会成为问题,因此请寻找将此行为提取到值对象中的机会。

它还使得单元测试很多边缘情况变得更加容易,因为你可以单独测试值对象。

在决定更改是否可以发生之前,您的实体可能需要跨多个值对象执行验证,但然后值对象负责更改本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接