Skip to content

领域服务

领域模型里的无状态的对象,被称为领域服务。它们一般封装了一个算法、交互过程。

领域服务都是单例吗?

一般都是。由于领域服务无状态的特点,它们一般都是线程安全的,因此一般用单例的方式来实现。

领域服务里持有对的领域服务的引用,那这个引用不是状态吗?

很多时候这个引用并不会变化,并不是状态数据。它可以被全局的变量名来取代。实践中,我们是因为使用了类似 spring 这样的依赖注入框架,才这么用的,是对技术的一种妥协。

Factory Repository CommandHandler Policy 等这些对象是领域服务?

是的。它们是一种领域服务。

只有领域服务才能调用聚合的函数,别的对象不能直接调用聚合的函数?

不是。

有些人的实现方式里,用领域服务作为聚合的代理,这个时候,称这种领域服务为 XxxService XxxManager。这种实现方式实际上是贫血模型后遗症。在使用贫血模型(错误实践,永远不要用)时,由于聚合里面只有数据,就只好把聚合内的所有逻辑都集中到某个 XxxService 中,这才导致了必须通过 XxxService 去使用聚合。

在正确的设计方式里,聚合包含了自己的数据和逻辑,如果还要搞这个 XxxService XxxManager,就会发现这种领域服务内没有多少功能,显得很多余。

事件风暴建模过程已经建出所有的领域服务了吗?似乎没有强调领域服务?

事件风暴建模过程不是很关注领域服务。领域服务只是对领域对象的一种分类,不在事件风暴建模中占核心位置。事件风暴的建模结果实际上隐含存在 CommandHandler DomainEventPublisher Repository Factory Policy 等领域服务。

什么时候我需要一个领域服务?

任何时候,只要你需要一个对象来帮你完成某个功能,你就定义这个兑现就好了。如果这个对象恰好是无状态的,那它就是领域服务了,就是这么简单。

看起来领域服务似乎不是很重要?

确实,相对来说没有那么重要。然领域服务不是领域模块的中心位置,但是它是领域对象间协作的胶水,也承担不可或缺的责任。