当操作在概念上不属于任何实体或值对象时,我们应该创建一个域服务,而不是将行为强制到一个对象中。
服务的接口应该根据领域模型的其他元素来定义。换句话说,服务的参数和返回值应该是领域对象
a) 为什么域服务应该/必须使用域对象作为参数和返回值?
b) 为什么 DDD 也不要求 Entities 和 Value Objects 的方法使用域对象作为参数和返回值?为什么这个约束只放在服务上?
谢谢
欧乐汇:
1)
这两个约束都促进了不变性和函数式风格
a) 这两个约束如何促进不变性?
b) 什么是功能风格?
c)所以我们应该尝试(因为它可能并不总是可以使用 force )强制服务使用域对象作为参数和返回值,即使该服务(即行为)接受/返回可能更自然非域对象?
2)
实体和值对象组成更多的原始类型以形成复杂类型,并且某些行为可能取决于原始参数。
那么,在大多数情况下,它们的行为(即它们的操作)对原始类型(即使用原始类型作为参数)进行操作是否是由于域实体/值对象的某种内在特征?如果是,那么在大多数情况下,这种内在特征是否存在于域对象中,但很少存在于域服务中?
第二次更新:
这两个约束如何促进不变性?
这个想法是域服务不会改变状态,并且所有状态更改都通过参数显式地进行。
a) 不改变自己的状态或某些域对象的状态?由于域服务应该是无状态的,我假设你的意思是它不应该改变 DO 的状态?换句话说,服务通过确保它打算修改的任何 DO 都作为参数传递给它(即传递给它的操作)来促进不变性?
b) 但是如果要被服务修改的 DO 没有作为参数传递,那么我们说域服务改变了这个 DO 的状态?
c) 改变 DO 的状态被认为是一件坏事的原因是因为它不会提高清晰度(即,在查看服务操作的签名时并不是很明显,哪些 DO 将通过手术 )?
d) 如果域服务要修改作为参数传递给它的 DO 的状态,如果它将用于更改此 DO 状态的值也作为参数传递给服务,那将是理想的吗?如果是,是因为它促进了清晰度还是……?
2)我仍然不明白返回值与参数类型相同如何促进不变性?
欧乐外汇 3
一个)
域服务可以通过返回对象的新实例而不是修改传入的对象来避免状态突变。
不是一个问题,更多的是一种观察,但有些困难理解为什么这种服务行为在大多数领域模型中很常见,甚至这种行为是在对领域建模时自然产生的,还是我们必须将它强加到概念中?!
b)
是的,尽管在这种情况下,域对象自己变异会更好。
DO 自身发生变异的主要原因是因为在特定 DO 上执行变异的代码集中在一个地方,所以如果我们需要检查这段代码,我们知道在哪里寻找它?