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

领域驱动设计(DDD):分层架构的三种模式 DDDDDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式。UL(Ubiquitous Language,通用语言)是团队共享的语言,是DDD中最具威力的特性之一。不管你在团队中的角色如何,只要你是团队的一员,你都将使用UL。由于UL的重要性,所以需要让每个概念在... 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.cn/post/6909774974400069639

  • 严格分层架构

  • 松散分层架构(Relaxed Layered System)

  • 继承分层架构(Layering Through Inheritance)

  • 包(Package)与分层架构

  • 资源库(Repository)

  • 三层或四层架构


分层架构

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

严格分层架构

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

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

OSI-layers

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

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

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

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

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

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

松散分层架构(Relaxed Layered System)

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

IS-layers

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

继承分层架构(Layering Through Inheritance)

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

IS-DIP-layers

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

领域层 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;
    }

    @Override
    public User save(User user) {
        return this.entityManager.merge(user);
    }
}

包(Package)与分层架构

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

资源库(Repository)

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

三层或四层架构

IS-representation-layers

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

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

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

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

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

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

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
DDD领域驱动设计四、分层架构和代码模型 一、DDD的分层架构 DDD 分层架构包含用户接口层、应用层、领域层和基础层。通过这些层次划分,我们可以明确微服务各层的职能,划定各领域对象的边界,确定各领域对象的协作方式。。 DDD的分层架构如图:从上到下依次是:用户接口层、应用层、领域层和基础层。 那 DDD 各层的主要职责是什么呢?下面我来逐一介绍一下。 1、用户接口层 用户接口层负责向用户显示信息和解释用户指令。这里的用户可能是:用户、程序、自动化测试和批处理脚本等等。 2、应用层 实现服务组合和编排,适应业务流程快速变化的需求,这一层聚集了应该服 阅读详情

相关推荐

DDD领域驱动设计实战-分层架构及代码目录结构

[](()1.1 分层架构的基本原则 每层只与位于其下方的层发生耦合。 [](()1.2 分层架构的分类 严格分层架构(Strict Layers Architecture) 某层只能与其直接下层耦合,即我的奴隶的奴隶,不是我的奴隶。 松散分层架构(Relaxed Layers Architecture) 允许任意上层与任意下层耦合。由于用户接口层和应用服务通常需要与基础设施打交道,许多系统都是该架构。 较低层有时也可与较高层耦合,但只限于采用观察者 (Observer)模式或者调停者(Med

m0_69377236的博客 4099

DDD-经典四层架构应用

DDD-经典四层架构解读DDD分层与传统三层区别DDD分层详解四层架构图分层作用领域对象DDD编码实践代码结构描述领域模型注入仓储类的问题 DDD分层与传统三层区别 根据DDD领域驱动设计原则,对应的软件架构也需要做出相应的调整。 我们常用的三层架构模型划分为表现层,业务逻辑层,数据访问层等,在DDD分层结构中既有联系又有区别, 个人认为主要有如下异同: 在架构设计上,在DDD分层结构中将传统...

最爱下雨天 4万+

领域驱动设计(2) 领域事件、DDD分层架构

领域事件什么是领域事件为什么需要领域事件微服务场景下的领域事件领域事件的实现DDD的分层架构DDD分层架构如何推动微服务演进领域事件什么是领域事件在事件风暴过程中,会识别出命令、业务操作、实体等,此外还有事件。比如当业务人员的描述中出现类似“当完成...后,则...”,“当发生...时,则...”等模式时,往往可将其用领域事件来实现。领域事件表示在领域中发生的事件,它会导致进一步的业务操作。如电商中,支付完成后触发的事件,会导致生成订单、扣减库存等操作。为什么需要领域事件领域事件的最终目的是为了实现聚合之间

zhixin9001的博客 4240

DDD领域驱动设计-经典四层架构划分 + DDD建模分析过程

DDD经典四层模型架构划分以及建模分析过程

lqs_user的博客 1万+

AutoDL跑yolo

由于博主在AutoDL的JupyterLab的终端直接上传ZIp文件要么老是再上传中被中断,要么就是上传后使用unzip指令解压显示“找不到”,作为纯小白的我实在太难了!这个文件列出了一个 Python 项目所需的所有依赖包及其精确的版本号。这个文件是 Python 项目中常见的一种方式,用于确保项目在不同环境中都能以相同的依赖包配置运行。3.进入JupyterLab,在文件夹目录中找到上传的文件夹,右键点击“复制路径”。然后在终端中输入以下指令进行切换到该文件夹路径。9.安装成功后开始输入指令开跑!

m0_73804659的博客 1206

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4629

DDD代码分层架构

DDD四层架构 1、用户接口层:负责用户显示信息和接受用户的指令,包含:用户、程序、自动化测试、批处理等 2、应用层:理论上不应该有业务规则或逻辑,主要面向用例和流程相关的操作,由于领域层之上,所以包含了多个聚合,可以协调多个聚合服务和领域对象完成服务编排和组合。负责处理业务用例的执行顺序和结果的拼装,例如:安全认证,权限校验,事务控制,发送或者订阅领域事件 3、领域层:领域层主要体现领域模型的业务能力,用来表达业务概念,业务状态和业务规则。 4、基础层:贯穿所有层,采用依赖倒置设计为其他层提供.

Dowjone梦工厂 5866

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)

项目名称(本质:栈溢出攻击)【源码在文首】和lab1一样,此题又是美国卡耐基梅隆大学的平时作业哈哈哈! 项目要求是把栈溢出,强行更改函数返回值,输出0xdeadbeef。

2301_79586491的博客 1544

DDD领域驱动-经典四层架构设计及应用详解

DDD (Domain-Driven Design),即领域驱动设计是思考问题的方法论,用于对实际问题建模,它以一种领域专家、设计人员、开发人员都能理解的通用语言作为相互交流的工具,然后将这些概念设计成一个领域模型。由领域模型驱动软件设计,用代码来实现该领域模型。所以,DDD 的核心是建立正确的领域模型。

深圳市多克创新科技有限公司 6811

STMCubeMX使用TB6612驱动编码轮并进行测速

TB6612电机驱动模块通过IN1和IN2引脚控制电机的旋转方向,并通过PWM信号的占空比调节电机速度。代码示例展示了如何使用GPIO控制电机的正反转,以及如何动态调整PWM占空比实现速度控制。系统设计中,TB6612与编码减速电机连接,STM32CubeMX用于初始化GPIO和PWM输出。编码器接口配置使用TIM3进行测速,TIM4定时器用于速度计算。Keil软件中编写的代码包括编码轮计数值获取、速度计算、电机正反转控制以及小车运动控制等功能。通过OLED显示速度,并实现电机的调试与测试。

wwivn的博客 2262

物联网开发笔记(34)- 使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

zhusongziye的博客 1万+

DDD(领域驱动设计)—— 微服务架构

微服务架构模型有好多种,例如洋葱架构、六边形架构和 CQRS 架构等等。种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出高内聚低耦合的架构,轻松实现架构演进。DDD 分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。

Doublelv 的博客专栏。 4215

SAP SD销售订单抬头自定义字段增强:BADI_SLS_HEAD_SCR_CUS实战指南

SAP ERP系统中的销售订单管理是企业核心业务流程,经常需要扩展标准功能来满足个性化业务需求。在SAP SD模块中,销售订单抬头屏幕的增强是常见需求。通过BADI(Business Add-In)技术,可以在不修改标准代码的前提下,实现自定义字段的添加与数据处理。本文详细介绍了如何使用BADI_SLS_HEAD_SCR_CUS实现销售订单抬头自定义字段,包括函数组子屏幕设计、数据存储表构建以及BADI方法的具体实现。这种增强方式适用于VA01/VA02/VA03等事务,保证了系统升级的兼容性和维护的便捷性

weixin_29758911的博客 349

2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计,赶紧收藏起来吧

DDD领域驱动设计分层架构,MVC模式 VS DDD模式,战略设计,战术设计,问题空间,解决空间,事件风暴,通用语言,限界上下文,上席文映射,问题域,领域,贫血模型,充血模型,领域模型,问题空间,解决空间,问题域,子域,核心子域,通用子域,支撑子域,领域事件,实体,聚合,聚合根,应用服务,领域服务,仓库,工厂,防腐层等概念)的DDD分层架构-四层架构(接口层,应用层,领域层,基础设施层)越、六边形架构,洋葱架构,整洁架构等来越热了,使代码依然整洁,利于扩展和维护,高度自治,高度内聚,边界领域划分的很清楚。

qq_41889508的博客 20万+

通达信抓波段指标(主图)

VAR3:=IF(INBLOCK('科创板'),VART20,IF(INBLOCK('创业板') AND DATE>1200823,VART20,IF(INBLOCK('ST板块'),VART5,VART10)));VAR5:=IF(INBLOCK('科创板'),CT20,IF(INBLOCK('创业板') AND DATE>1200823,CT20,IF(INBLOCK('ST板块'),CT5,CT10)));曾涨停/紫色细K线:青字"炸",涨停未封住。曾跌停/蓝色细K线:红字"撬",跌停被打开。

q125500612的博客 2136

C++ (week6、7):Linux系统编程4:网络

Linux网络:计算机网络概述、TCP协议、Socket编程、IO多路复用机制(select、epoll)、HTTP协议、进程池、线程池、大文件网络传输问题

Edward2022的博客 1430

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

微服务架构模型有好多种,例如整洁架构、CQRS 和六边形架构等等。每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。而 DDD 分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。

Carroll的博客 2311

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

DDD全称为(Domain-DrivenDesign,简称DDD),领域驱动设计。

m0_49499183的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

详解DDD领域驱动设计:从理论到实践掌握DDD分层架构设计

软件开发的核心挑战在于应对复杂性。传统开发往往从数据结构入手,导致代码与业务脱节。随着微服务流行,DDD重新成为焦点,因为它提供了一种从业务驱动的技术路径。小编先问大家一个问题,也算是高级工程师面试中常问的问题,怎么样才能设计出一个好的软件系统,或者说一个高质量的大型软件系统应该具有哪些特点?可扩展性:业务变化时,代码易调整。可维护性:新手快速上手,老代码不腐烂。高性能:应对高并发、低延迟。可靠性:7×24运行,故障隔离。DDD也是设计一个高质量软件系统中的一种解决方案。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1502

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

DDD「领域驱动设计」分层架构初探

前言 基于 DDD 传统分层架构实现。 项目 github地址:https://github.com/WuMortal/DDDSample 这个分层架构是工作中项目正在使用的分层架构,使用了一段时间发现受益匪浅,所以整理好我对该分层架构的一些理解分享给大家,我对于该分层架构还处于学习阶段理解有误的地方请指出。本次会以一个案例来说明各个分层的作用以及他们之间的调用关系,还有本次的重...

bangsi0483的博客 656

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

点击下方“IT牧场”,选择“设为星标”1 DDD分层架构1.1 分层架构的基本原则1.2 分层架构的分类1.3 分层架构演进2 各层职责2.1 用户接口层2.2 应用层2.3 领域层2.4...

ITMuch的专栏 711

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

由于由近几年微服务架构兴起,领域驱动设计也被大多领域专家重新看待。但是其实这其实本来是不想关的两个东西,领域驱动设计更加强调的是一个架构设计理念,所谓理念的东西,就像是建议你怎么做,但不会对,而微服务着重在架构设计 由于DDD设计的理念偏广,DDD名词概念,DDD与微服务落地,DDD事件风暴及领域建模,DDD大中台实践,DDD与领域模型一致性等等话题,笔者这里就DDD分层架构展开编写,当然...

永生只是一场幻梦 3968

中德AI开发者社区 2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计

在当今软件开发领域,尤其是微服务和复杂业务系统设计中,领域驱动设计(DDD)已成为一种核心方法论。它不仅仅是一种技术实践,更是一种思想体系,帮助我们从业务本质出发,构建高内聚、低耦合、可维护的软件架构。DDD强调业务模型与代码模型的一致性,避免了传统MVC模式中常见的“贫血模型”问题,让软件更贴合业务变化。如果您是初学者,先从MVC vs DDD对比入手;如果是资深开发者,重点看战术设计与代码模型。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 794

DDD领域驱动设计实战-分层架构

整洁架构、CQRS、六边形架构等微服务架构都旨在“高内聚低耦合”。那DDD分层架构又如何?1 DDD分层架构1.1 分层架构的基本原则每层只能与位于其下方的层发生耦合。1.2 分层架构的...

JAVA高级架构 1186
上一篇: 一起来看看 Mybatis 中使用的 9 种设计模式!
下一篇: 牛逼了!JDK 16 ZGC 实现最大暂停时间不超过1ms
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值