再谈领域建模和领域服务

标签: 随笔文章 | 发表时间:2013-08-31 23:50 | 作者:人月神话
出处:http://blog.sina.com.cn/cmmi
对于贫血的领域层,主要体现在两个方面,一个是没有领域业务对象的概念(领域模型中的聚合根),一个是没有明确的粗粒度的业务规则逻辑处理层。在这种情况下,原有的业务逻辑层变化为仅仅是DAL层的一个简单封装或通道,实际的业务处理全部转化到action层或dal层进行了处理,导致无法真正提炼一个业务模块真正应该具备的领域服务能力。

粗粒度的领域服务提供包括两个方面,一个是完整的领域业务对象提供的数据服务,一个是处理业务规则和逻辑用的业务服务。在领域驱动设计中,前者部分在仓储模型中完成,后者在service中完成。这里要注意DDD里面的service,和我们基于SOA分析和设计中的服务层仍然还是有差别,所有的共性的,应该提供给应用层访问的粗粒度的能力都应该抽象为服务层的服务。

在当前的领域分层架构中没有服务层的概念,在领域层和应用层都有服务,可以将服务层进一步抽取出来,服务层即向应用层提供所有的服务能力。这个服务能力不仅仅是原子服务能力,也包括了组合服务能力。对于服务层提供的服务能力,由服务层控制事务。对于进一步的服务编排,则在应用层进行完成,如果完全基于SOA参考架构,则在上面还会有BPM或BPEL层,重点是对原子服务进行组装和编排。

实体要考虑两个层面,一个是完全的data entity,一个含操作的entity,为了考虑在SOA架构中的数据和操作分离,建议还是采用完全的data entity实体,这个时候这种实体可以进一步作为跨层传输的DTO对象。而对于原有的DAO层,也不仅仅是实现数据的持久化,很多OR-Mapping操作也会在该层完成。数据层关注的是数据对象即和数据库一一映射的表,而领域层关注的是领域对象(可能涉及多张强聚合的表);数据层最终关心的是数据对象的持久化,而领域层关心的是业务对象全生命周期的管理。

在考虑了数据和操作分离后,对于聚合根的业务对象应该有一个专门的业务对象类,来处理所有和业务对象属性,状态变化相关的操作,即控制业务对象完整的数据和生命周期。而service类本身不应该对数据进行任何cud操作,service类的所有操作都应该转入到业务对象类中进行处理。在这种模式下service类目的仅仅是处理业务规则和逻辑,最终处理结果的落地仍然通过业务对象类来完成。

一个完整的业务系统的构建,不是简单的横向分层,还包括了纵向的分业务模块和业务组件。在领域驱动设计里面没有太多的对这两块结合的描述。在这里要注意两个方面的内容,一个是每一个业务组件都会向上层提供领域服务能力,第二每一个业务组件也会向其它业务组件提供领域服务能力。如果考虑业务系统开发的完全组件化架构和后续的分布式组件部署,那么就需要考虑对于向外部提供的领域服务,需要采用根据松耦合的服务方式向外部提供和发布(soap web service/rest 等),而对于内容提供的领域服务即可以仍然沿用常规api方式。对于同一个业务模块而言,如果要考虑到后续的领域服务层也可以单独的分层部署,那么所有的领域服务都需要通过松耦合的方式向外发布。

  青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟!!   你不得不信的星座秘密

相关 [服务] 推荐:

服务禁语

- tiancaicai - 白板报
前几天在一个公交汽车站拍到了一张规定,里面规定了服务禁语和礼貌用语,看了大乐. 3、乘车高峰车厢内拥挤时,禁语:“快往里走,站在前面又没有钞票检. ”文明语:“请尽量往里走,照顾没有上车的乘客”. 4、车子抛锚,禁语:“车子抛锚没有办法,人都要生毛病的,车子坏了也正常. ”文明语:“对不起,车子出现故障修一下,请大家理解.

服务熔断

- - CSDN博客推荐文章
服务熔断也称服务隔离,来自于Michael Nygard 的《Release It》中的CircuitBreaker应用模式,Martin Fowler在博文 CircuitBreaker中对此设计进行了比较详细说明. 本文认为服务熔断是服务降级的措施. 服务熔断对服务提供了proxy,防止服务不可能时,出现串联故障(cascading failure),导致雪崩效应.

面向服务与微服务架构

- - CSDN博客推荐文章
最近阅读了 Martin Fowler 和 James Lewis 合著的一篇文章  Microservices, 文中主要描述和探讨了最近流行起来的一种服务架构模式——微服务,和我最近几年工作的实践比较相关感觉深受启发. 本文吸收了部分原文观点,结合自身实践经验来探讨下服务架构模式的演化. 面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过.

经理服务生

- netcasper - 坏脾气的小肥
2007年的时候,我和内容团队一起去报道上海车展,累得够呛,写稿子到凌晨一两点,早上八点钟又要爬起来去现场或更新早班. 有天上午,编辑都挤在大会议室里忙活着整理、发布、撰稿,而我搞完了竞品检查/数据分析/计划修订,一时间闲着,就打算去买些零食给大家. 环顾四周,没人有空,只好自己下楼,嘿咻嘿咻拎了两三百块钱的零食上来.

Kernel.org恢复服务

- Adam - Solidot
kernel.org 王者归来 写道 "Linux内核官网在八月份遭入侵,之后于9月11日linux.com linux.org kernel.org LinuxFoundation.org皆无法访问,进行安全维护. 经过紧张的修复,kernel.org终于恢复服务. LinuxFoundation.org也可以正常访问.

谈领域服务

- - 人月神话的BLOG
对于跨系统和模块间的SOA服务识别和分析我前面文章谈的比较多,这块的SOA服务重点是实现跨系统和模块的业务交互和协同,而对于领域服务而言则更加关心的是对于单个系统或模块,其应该如何抽象领域对象并将其能力以粗粒度服务方式保留给应用层用. 在领域建模中的整体思路中,我们做两个层面的理解,其一是领域模型层重点是隔离传统的数据表并抽象为领域对象;而对于领域服务层重点是则将应用层和领域模型层解耦,模型层提供的能力是以领域服务的方式暴露到应用层使用的.

DNS服务-详解

- - 操作系统 - ITeye博客
DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. <1> 客户机提交域名解析请求,并将该请求发送给本地的域名服务器. <2> 当本地的域名服务器收到请求后,就先查询本地的缓存. 如果有查询的DNS信息记录,则直接返回查询的结果.

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.

TopBeat服务安装

- - ITeye博客
TopBeat是一个简单的服务器数据采集脚本,已经获取服务器进程的CPU,内存,磁盘使用数据. 并将数据输出到ElasticSearch,Redis等服务中,非常的简单易用. 1.下载TopBeat.     修改topbeat.yml,中的localhost,改成ES主节点IP 192.168.100.92.

Google  的 favicon 缓存服务

- 小猫 - 我爱水煮鱼
在添加友情链接或者其他操作的时后需要应用其它网站的图标(favicon),如 iPad 网址导航,如果一个一个去找会非常麻烦,Google 提供了一个比较快速得到相应网站 favicon 的服务,使用下面的 URL 调用 GOOGLE 的 favicon 缓存,将后面的域名改成相应网址即可,没有favicon的网站会显示一个小地球.