再议 DDD 分层

之前整理过 《DDD分层》 [1] 以及 《分层架构》 [2]

最近看网友讨论,整理一些有亮点的地方

现在分层架构+整洁架构似乎是个万金油组合了

之前DDD的标准分层结构:

右边传统分层,左边经过DIP改进型,两者有什么区别呢?

眼尖的人可以看出来,两者确实差了不少

线条1:application到infrastructure被反转了

线条2:这条线没有了,在MVC里面这线是常见的,applicaton与domain没分开,但DDD中这条线是不推荐的,就算在松散分层架构中也一般不使用,除非简单的CRUD项目

线条3:也被反转了,这其实类似CQRS中的Q部分

以上来源于群友的讨论,真的是世上无难事,只怕有心人;这点区别真没留意过

这图来源于阿里大牛殷浩之手, 《阿里DDD四弹》 [3] 中进行过总结,DTOAssembler放在了application层,有些不太合理

在《分层架构》中thrift的TService,为了不与controller重复,所以需要一个application service,此时thrift与controller可以有相同的业务请求

也就是说controller对外有多种输入,但对应用层来说都是同一个user case,如果放在应用层内转化,是不是应该层为了同一个use case要爆露多过方法

适配层做三件事:

1. 协议适配(如采用controller,通过 @RequestMapping 注解和 JSON 序列化) 2. 参数规则验证(如,不能为空、手机是数字并且11位、邮箱要有@之类简单验证) 3. 为调用下层(应用层)转化输入(assembler)

如果说分4层的话:

1. controller (assembler、转化) 2. appliction 3. domain 4. repository(convertor、转化)

应用层是真正的业务入口,是很披的一层:

1. 用来协调领域操作 这里一般看系统架构不一样会有所不同,主要再分为同步调用的方式,和步骤事件的方式。 2. 关注点分离的操作(如日志、通知等)

application service编排业务,domain service编排领域

References

[1] 《DDD分层》:  http://www.zhuxingsheng.com/blog/ddd-layering.html

[2] 《分层架构》:  http://www.zhuxingsheng.com/blog/layered-architecture.html

[3] 《阿里DDD四弹》:  http://www.zhuxingsheng.com/blog/ali-ddd-four-bombs-to-read.html