在领域驱动设计中,service有两种:领域服务和应用服务,单纯从它们的定义来看,两者很容易区分,前者是与业务逻辑密切相关的服务,往往处理复杂的业务请求。后者则是面向应用角度的一些支持功能,与业务本身并无太大关联。一些典型的应用服务有:发送电子邮件通知用户,对密码进行加密解密等等。在oobbs中,要在导航栏中显示当前位置的路径(一个像:index->forum1->thread1的路径)也是由一个应用层面的服务负责的。但是正如《领域驱动设计》一书所说的,实际上,区分领域服务和应用服务是一件很困难的事件,因为很多时候一个服务既有应用相关的东西,又有业务方面的内容,就像上面提到的例子,路径本身也反映了业务对象之间的层次关系,因此这个应用服务也必然要涉及到领域模型的一些细节。
过去曾经纠结过是否应该提供两个服务层,下层的领域服务层属于领域模型的一部分,上层的应用服务层属于应用层。但是这个方案在实践中被渐渐地否定了。一方面,正如上面所说的,应用服务并不是凌驾于业务层之上的一层服务,某些时候它们相互独立,不存在相互的依赖关系,而更多的时候,它们是糅合合在一起一个整体,很难再进行细分,也没有必要再这样做。如果真得强行划分出应用服务层和领域服务层,那么大多数应用层服务将只能是对领域层服务的简单调用。最根本的原因还是刚才提到的,应用服务和领域服务没有上下之分,要么相对独立,要么揉合在一起。因此,系统应该只提供一个统一的服务层即可。
dddsample