首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
摘抄来自论坛的一些DDD讨论
时间:
2016-01-23 13:05:28
阅读:
126
评论:
0
收藏:
0
[点我收藏+]
标签:
先说说之前几次
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.cnblogs.com/root_u/p/5153056.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!