摘抄来自论坛的一些DDD讨论
先说说之前几次DDD项目失败的案例,其实也不能算是失败,只是没有领会DDD的思想。
之前的DDD是建立在数据层之上的,首先是每张数据表对应一个数据实体,每个数据实体由泛型的DAO管理,DAO又被数据上下文继承以实现事务,这就构成了数据层,业务代码是写在DataContext中。
数据层:DataEntity <- DataMapper<DataEntity> <- DataContext
在这样的数据层之上构建了“貌似”DDD的领域层,首先由领域对象继承数据上下文以实现序列化和脏读校验等功能,聚合根又继承领域对象以实现级联更新、延迟加载和管理领域对象之间的关联,最后由实现了LINQ查询的仓储对象管理聚合根,这就是当时的领域层。
领域层:DataContext <- Entity <-RootEntity <- Repository
这套架构陆陆续续用了1年左右,在运用的过程中发现DDD除了增加项目的复杂程度之外,没有带来任何好处,这是为什么呢?
直到前段时间我才发现,构建在数据层之上的领域层完全就是一个错误,领域层应当处于整个项目中的最底层,而且完全不用继承IEntity,IRepository之类的接口,正是这些接口绑架了领域模型。
==================分割线==================
经过重新设计的领域层今天终于完工了,处于最底层的仍旧是数据实体,原来的泛型DAO和DataContext全部都移动到了横切层,以类似于切面的方式向领域层提供服务。
数据实体之上是值对象,值对象是完全按照领域需求构建的。数据实体和值对象之间还有一层薄薄的数据转换服务,用于将面向数据库的数据实体转换为面向领域的值对象。
数据层:DataEntity <-> Data Transformation Services <-> ValueObject
数据层之上是领域层,一个领域对象内持有若干个值对象,领域对象负载维护自生的状态,和领域对象处于同一层次的是领域服务,领域服务更倾向与处理业务逻辑,在两者之上有仓储对象,仅负责查询。
领域层:Entity / Service <- Repository
构建在数据层和领域层之外的是横切层,横切层提供轻量级的数据服务,例如事务管理、对象缓存,单例模式的DataMapper。这些服务都是以using的方式提供,即:只能在小范围的函数块内使用,使用过后自动销毁。
横切层:EventManager / CacheManager / DataManager 等。
==================分割线==================
现在的领域层已经处于整个项目的最底层了,ValueObject完全是按照领域的对象的需求构建的,使用起来得心应手。
今天在一个大项目中实践后发现,完全可以不参考UI设计,不参考原型设计,只按照需求说明书设计领域结构,设计完成之后的领域模型居然很神奇的符合UI和原型的需求。
这样的开发流程似乎也很符合TDD的理念,接口先行、之后是测试、再后来是功能、最后才是UI。
原来的数据层现在分散到了3个部分:
1、删除重量级的ORM功能,例如级联更新,延迟加载、连表查询等
2、基本的单表持久化移动到横切层,注意最下面一条虚线,现在数据持久化是通过数据实体发消息给数据存储实现的。
3、缓存管理、事务管理移动到横切层,现在直接缓存领域对象,而不是缓存数据实体
也就是说,现在已经没有传统意义上的数据层了,数据存储都是通过消息机制将更改DataEntity的操作传递到持久化服务,持久化服务只有非常简单的CUD功能,可以连接到Sql,NoSql甚至XML文件。
这正是这张图想表达的内容,仓储层并不需要和数据库进行交互。
我们习惯性的思维,仓储需要接受一个请求,然后查询数据库获得数据实体,再将数据实体转换为领域对象。人总是有惰性的,有时候为了省事,数据实体就直接参与业务逻辑、甚至是返回给UI了。
在这张图上,领域层、应用层、UI层都是访问不到数据实体的,对领域对象进行的任意操作都会经由数据转换服务(防腐层)转换为若干条DataEntity.Change消息,数据存储(持久化服务)复杂侦听这些消息,并连接数据库。
也就是说领域层只需要修改数据,而不需要关心持久化的问题。
http://www.jdon.com/44900
摘抄来自论坛的一些DDD讨论的更多相关文章
- http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,
http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,
- 拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计
首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘境:来自 Repository 的一丝线索,Domain Model ...
- DDD 回归具体的业务场景,Domain Model 再再重新设计
DDD 回归具体的业务场景,Domain Model 再再重新设计 首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘 ...
- csdn论坛页抓取
抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...
- Repository 仓储,你的归宿究竟在哪?(一)-仓储的概念
写在前面 写这篇博文的灵感来自<如何开始DDD(完)>,很感谢young.han兄这几天的坚持,陆陆续续写了几篇有关于领域驱动设计的博文,让园中再次刮了一阵"DDD探讨风&quo ...
- 超全的web开发工具和资源
首页 新闻 产品 地图 动态 城市 帮助 论坛 关于 登录 注册 · 不忘初心,继续前进,环境云V2接口正式上线 · 环境云测点地图全新改版 · 祝福各位环境云用户中秋快乐! 平台信息 培训互动 ...
- 安全协议系列(五)---- IKE 与 IPSec(中)
在上一篇中,搭建好了实验环境.完整运行一次 IKE/IPSec 协议,收集相关的输出及抓包,就可以进行协议分析.分析过程中,我们将使用 IKE 进程的屏幕输出和 Wireshark 抓包,结合相关 R ...
- wcf和web service的区别
1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...
- 深入理解javascript:揭秘命名函数表达式
这是一篇转自汤姆大叔的文章:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 前言 网上还没用发现有人对命名函数表达式进去重复深 ...
随机推荐
- Step one : 熟悉Unix/Linux Shell 常见命令行 (二)
2.学会使用一些文本操作命令 sed -- stream editor 1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pat ...
- .net实现依赖注入
.net实现依赖注入 1. 问题的提出 开发中,尤其是大型项目的开发中,为了降低模块间.类间的耦合关系,比较提倡基于接口开发,但在实现中也必须面临最终是“谁”提供实体类的问题.Martin Fowle ...
- twobin博客样式
twobin博客样式—“蓝白之风” 自暑假以来,囫囵吞枣一般蒙头栽入前端自学中,且不说是否窥探其道,却不自觉中提高了对网页版面设计的要求,乃至挑剔.一个设计清爽美观的网页能让读者心旷神怡,甚至没有 ...
- CentOS6.8安装JDK1.7
一.查看当前系统是否自带JDK rpm -qa | grep java tzdata-java-2016c-1.el6.noarch java-1.7.0-openjdk-1.7.0.99-2.6.5 ...
- Nginx反向代理实现Tomcat多个应用80端口访问
应用背景 一般我们在开发时,一个工程里会有多个Web应用,比如一个前台一个后台,那我们就需要配置2个Tomcat服务器,比如一个是http://localhost:8080,一个是http://loc ...
- smtp中ehlo的使用
以前玩smtp的时候申明都是用的helo,最近在整理邮件服务的时候,才知道还有一个叫做ehlo的(太落后了). google了一下,了解了基本上是这么个情况:ehlo是对helo的扩展,即extend ...
- web前端学习笔记
web前端学习笔记(CSS盒子的定位) 相对定位 使用相对定位的盒子的位置常以标准流的排版方式为基础,然后使盒子相对于它在原本的标准位置偏移指定的距离.相对定位的盒子仍在标准流中,它后面的盒子仍以标准 ...
- 用TableView做的新闻客户端展示页面
用TableView做的新闻客户端展示页面 // MyTableViewImageCell.m // SildToDo // // Created by WildCat on 13-8-18. ...
- 工具条OutLookBar
工具条OutLookBar 灰姑娘本身也有自已的优点,但是却可能因为外貌不讨人喜欢,要变成白雪公主却需要有很多勇气和决心去改变自已: 有一颗善良的心 讨人喜爱的外貌 我这里讲的是一个工具条的蜕变过程, ...
- 用T4消除代码重复,对了,也错了
用T4消除代码重复,对了,也错了 背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得 ...