领域驱动设计-学习笔记 服务

时间:2023-02-09 22:09:13

     有时,服务不仅仅是一件事情。

     现在,最常犯的错误就是太轻易地放弃把这种行为配置到合适的对象中去,却逐渐地转移到程序设计上。但是当我们把一个对象里加入并不符合对象定义的操作,这个对象就失去了清楚的概念,反而变得难以理解或重构。

    服务除了其他们掌握的操作之外,它没有自己的任何状态,在领域中也没有任何意义。

    领域中的一些概念不能作为模型中的对象来处理。将领域需要的功能强行加给实体和值对象,不仅会破坏模型中的对象的定义,而且还会人为地添加没有意义的对象。

    服务作为一种接口提供操作,它独立于模型,没有像实体和值对象那样封装状态。服务在技术框架中是一种通用模式,但是它也可以应用于领域层。

    所谓服务,它强调的是与其他对象的联系。不像实体和值对象,服务完全是根据能够为客户做什么来定义的。服务往往代表一种行为,而不是一个实体,是一个动词而不是一个名词。服务有一个定义好的职责,它的职责和接口被定义为领域模型的一部分。调用的参数和返回的结果应该是领域对象。

   一个优秀的服务具备3钟特征:

     1.与领域概念相关的操作不是实体和值对象中固有的部分

     2.接口根据领域面向模型中的其他元素来定义

     3.操作是无状态的

    这种无状态是指任何一个客户都可以使用服务的所有实例,而不管这个实例的来源。服务的执行将使用全局可访问的信息,甚至改变这些信息(这也就是说它可能有副作用)。

     当领域中的一个重要进程或转换操作不是实体和值对象的时,把操作作为一种独立的接口加入模型,并声明服务。根据模型使用的语言来定义接口,保证操作名是通用语言的一部分,使这个服务变成无状态的。