网易首页 > 网易号 > 正文 申请入驻

领域驱动设计(DDD):分层架构

0
分享至

  分层架构

  在应用系统开发中,采用严格的、单一的、真正的的分层架构是可以的,但实际上我们已经采用了多种架构模式设计系统。当多种不同范式的架构混合在一起,你会不会出现“指鹿为马”的现象呢?

  严格分层架构

  在研究分层架构时,常通过概念性的定义或 OSI 七层应用(架构)来说明或解释分层架构:

架构模式 Layers 有助于将应用程序划分为多组子任务,其中每组子任务都位于特定抽象层。

  图片取自《 POSA , Vol.I , p22 》

  作为一个在项目中引入分层架构的应用者,我们应该从更具体的规范来实现分层架构:

  相邻层之间必须是单向耦合。上层只能依赖下层,下层永远不能依赖上层。

  相邻层之间必须是单向通信。上层去调用下层所提供的接口,下层永远不能调用上层的接口。

  《 POSA , Vol.I 》 为我们提供了更多的实现规范,然而我要解决的是有关层的单向依赖问题。因为有一些人在使用分层架构时,尤其是将分层架构引入到项目的目录结构时,对于某些对象的划分(从属)存在一些混乱问题。

  如果你有兴趣了解更多分层架构的实现规范,可参考:《 POSA , Vol.I 》第二十六页到第二十九页相关知识。

  松散分层架构(Relaxed Layered System)

  在领域驱动设计(DDD)中采用的是松散分层架构,层间关系不那么严格。每一层都可能使用它下面所有层的服务,而不仅仅是下一层的服务。每层都可能是半透明的,这意味着有些服务只对上一层可见,而有些服务对上面的所有层都可见。

  注意:松散分层架构依然是单向依赖,表明上层只能调用下层的服务,下层不能调用上层的服务。

  继承分层架构(Layering Through Inheritance)

  同时在领域驱动设计(DDD)中也采用了继承分层架构,高层继承并实现低层接口。我们需要调整一下各层的顺序,并且将基础设施层移动到最高层。

  注意:继承分层架构依然是单向依赖,这也意味着领域层、应用层、表现层将不能依赖基础设施层,相反基础设施层可以依赖它们。

  领域层 UserRepository 接口:

  package com.mallfoundry.user.domain;
public interface UserRepository {User save(User user);}

  基础设施层 JpaUserRepository 实现类:

  package com.mallfoundry.user.infrastructure.persistence;
public class JpaUserRepository implements UserRepository {
private final EntityManager entityManager;
public JpaUserRepository(EntityManager entityManager) {this.entityManager = entityManager;}
@Overridepublic User save(User user) {return this.entityManager.merge(user);}}

  包(Package)与分层架构

  我们确实使用包来划分层级,但是包名并不能真正表示分层。

  资源库(Repository)

  我们通常将资源库的实现放置在基础设施层,这是因为我们采用了继承分层架构。如果你现在采用的是松散分层架构,你需要将资源库的实现放置在领域层。这是层的单向依赖原则所致,你不应该破坏这个原则。没有任何理由需要破坏分层架构的单向依赖原则,除非你不采用分层架构。

  三层或四层架构

  我们应该从混乱到有序的这个历史过程去研究(分析)分层架构,尤其是我们现在处在前后端分离的环境下,应用系统使用分层架构又面临着什么样的划分变化。

  第一个阶段:应用系统只有两层:表示(现)层和数据库层。在视图中直接使用数据库所提供的访问接口操作数据,如:JDBC,在视图中直接使用ResultSet表示数据。(需要特别注意的是:在视图中直接使用ResultSet。)

  第二个阶段:应用系统划分为三层:表现层、领域层和数据库层。在这个阶段,我们已经开始意识到模型了,模型的出现意味着在视图中不再直接使用ResultSet了,而是使用从ResultSet相映射的编程语言中的结构体(struct)或者对象类(class)。这表示:从编程语言中的表示法可以抽象业务域中的概念结构了。

  第三个阶段:应用系统划分为四层:表现层、应用(业务)逻辑层、领域层和数据库层。由于业务逻辑依然存在视图中,我们需要将视图中的业务逻辑与视图分离出来,此时出现了应用层。同时表现层也有所推进,表现层使用 MVC 架构。通过在 Controller 调用应用层所提供的接口并获得接口所返回的模型(model)数据,并在 Controller 中将 model 和 view 组合起来,最终完成渲染工作。正是因为在表现层使用 MVC 架构使得视图(view)与下层实现松耦合。

  应用系统使用分层架构在第三阶段基本已经成熟。因为我们要探讨的是有关领域驱动设计(DDD)的分层架构,所以我们依然需要做进一步补充。具体包括两方面的补充:

  第四个阶段:面向对象的发展与应用,这个阶段对总的层次划分没有大的变化。具体的变化指的是有关应用层与领域层的内容,更具体的来说是领域层的变化。面向对象的出现使得大家开始使用面向对象来设计领域模型。这表示:由属性操作所表示的对象模型用来抽象业务域中的概念模型。同时这又表示应用(业务)逻辑层中的业务逻辑也将被对象领域模型所承担,应用层只需要控制协调有关对象领域模型的相关逻辑。非常幸运的是,Eric 对这一现象中的更多细节做了非常系统性的阐述,最终形成《领域驱动设计》这本书。

  第五个阶段:前后端分离后对分层架构的影响。在前后端分离的项目中,表现层被完全的从后端剥离出来,后端只需要提供接口数据,如:RESTful , gRPC , Thrift , GraphQL 协议的后端接口。此时后端还是不是四层架构呢?这确实伴随着两条发展路线:一条是服务于前端的后端模式(BFF)。另一条是基于聚合对象的接口模式。它们的区别在于 BFF 频繁变化,后者不会因为前端频繁变化而变化。

  免责声明:

  本公众号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,且仅代表作者个人观点,与本公众号无关,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
世界杯:葡萄牙VS乌兹别克斯坦!传来3好2坏消息葡萄牙赢球没悬念

世界杯:葡萄牙VS乌兹别克斯坦!传来3好2坏消息葡萄牙赢球没悬念

小青年渌渌
2026-06-23 21:56:38
张亮与19岁儿子天天合体拍摄,“张亮天天共用一张脸”登上热搜

张亮与19岁儿子天天合体拍摄,“张亮天天共用一张脸”登上热搜

韩小娱
2026-06-22 11:52:50
拉加德:对华搞“广场协议”,行不通

拉加德:对华搞“广场协议”,行不通

观察者网
2026-06-23 08:15:25
拍吻戏被传染口臭!男星爆「戴口罩都闻到腐臭味」 下场惨遭全网出征

拍吻戏被传染口臭!男星爆「戴口罩都闻到腐臭味」 下场惨遭全网出征

ETtoday星光云
2026-06-22 15:47:36
东风导弹泄密案!间谍郭万钧一家三口,全部被处以死刑

东风导弹泄密案!间谍郭万钧一家三口,全部被处以死刑

番外行
2026-03-31 08:28:28
WPS被骂上热搜!占满C盘致电脑卡顿,商业套路被扒,遭网友怒斥!

WPS被骂上热搜!占满C盘致电脑卡顿,商业套路被扒,遭网友怒斥!

谭谈社会
2026-06-21 19:10:56
茶叶被发现!医生研究发现:喝得越多,高血脂患者血管或越干净?

茶叶被发现!医生研究发现:喝得越多,高血脂患者血管或越干净?

汪医生健康百科
2026-06-22 18:14:42
很多人已经在崩k的边缘了!

很多人已经在崩k的边缘了!

灯锦年
2026-06-23 20:04:22
TA:切尔西愿以1.4亿欧出售恩佐

TA:切尔西愿以1.4亿欧出售恩佐

懂球帝
2026-06-23 20:18:11
向太半年瘦20斤谈身材焦虑:趁年轻没有好身材,老了更不可能有

向太半年瘦20斤谈身材焦虑:趁年轻没有好身材,老了更不可能有

韩小娱
2026-06-23 09:13:29
不是杨翰森王俊杰!荷兰主帅夸赞中国一人,他是中国男篮的未来

不是杨翰森王俊杰!荷兰主帅夸赞中国一人,他是中国男篮的未来

小青年渌渌
2026-06-23 21:59:49
美团员工发《置身团内》长文谈公司困境:已形成稳定的低效结构

美团员工发《置身团内》长文谈公司困境:已形成稳定的低效结构

识礁Farsight
2026-06-23 10:25:29
“对于梅西,我已经无话可说了”

“对于梅西,我已经无话可说了”

新浪财经
2026-06-23 19:35:35
全球首发!华为刚曝光的新机,真的很猛啊

全球首发!华为刚曝光的新机,真的很猛啊

科技堡垒
2026-06-21 11:51:14
中国不给脸,新加坡就是个县!英媒:中国富人正集体逃离新加坡

中国不给脸,新加坡就是个县!英媒:中国富人正集体逃离新加坡

好贤观史记
2026-06-23 11:58:12
75岁老人直言:岁数大了才发现,有存款和退休金,也是一种负担

75岁老人直言:岁数大了才发现,有存款和退休金,也是一种负担

多久情感
2026-06-22 15:35:57
人活多久,看吸烟就知道?研究发现:寿命短的人,吸烟或有这5个特征

人活多久,看吸烟就知道?研究发现:寿命短的人,吸烟或有这5个特征

宝哥精彩赛事
2026-06-23 03:42:24
天津2026年高考分数线公布:普通本科录取控制分数线为458分

天津2026年高考分数线公布:普通本科录取控制分数线为458分

新京报
2026-06-23 19:15:41
强制征缴9千万,滞纳金几近税款双倍,滞后国税总局政策10多年;元芳,你怎么看?

强制征缴9千万,滞纳金几近税款双倍,滞后国税总局政策10多年;元芳,你怎么看?

立生自由谈
2026-06-23 07:39:05
江苏省交通运输厅原副厅长金凌被查

江苏省交通运输厅原副厅长金凌被查

上观新闻
2026-06-23 15:32:47
2026-06-23 22:56:53
IT架构师联盟 incentive-icons
IT架构师联盟
IT架构实战分享
844文章数 7672关注度
往期回顾 全部

科技要闻

48名中国开发者联名举报苹果

头条要闻

看到热搜新闻查了下自己 男子结婚8年发现3娃均非亲生

头条要闻

看到热搜新闻查了下自己 男子结婚8年发现3娃均非亲生

体育要闻

扬尼斯去了迈阿密:凯尔特人怎么办?

娱乐要闻

内娱95后顶流格局发生潜移默化的变化

财经要闻

屋顶光伏度苦夏

汽车要闻

施鹏泽:为什么奥迪E7X强调座舱气味安全?

态度原创

家居
本地
艺术
房产
公开课

家居要闻

绿意盎然 自然之境

本地新闻

吃一次广东龙舟饭,才懂什么是豪华盛宴

艺术要闻

大连世界级地标!2026夏季达沃斯主会场——“钢铁贝壳”

房产要闻

洞察新局|预算不变 居住升级 2026广州置业成本观察

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版