DDD的简单落地实现

news2024/11/27 14:36:53

目录

概述

和微服务的联系

具体划分

遵循依赖倒置原则

其他规范

具体实现代码

总结


概述

领域式驱动(DDD)

这种模式的核心就是根据功能去划分领域,然后在这个领域内只做这个领域的事情。

和微服务的联系

和微服务有什么类似的地方,划分模块。

例如:一个大的服务,有基础微服务,人力资源微服务等,然后在具体的微服务下面可以分,更加具体的子类。

基础微服务需要提供,账号相关功能,团队相关功能,权限相关功能,而权限相关功能和账号相关功能可以再做细分。

领域式驱动也是这样,根据功能领域划分,就像你是一个城市设计师,这里规划修学校,哪里修公司。

不同的是微服务是一种架构,而领域式驱动是一种思想,这种思想的灵活性更强,基本上取决于你要怎么来划分。

具体划分

具体的目录划分如下

这是按照4层架构的方式来划分的,当业务更复杂的时候,也可以划分为5层,增加环境层,环境层主要是领域的行为绑定,聚合。使用得比较多的还是4层架构。

参考三层架构的对应关系的话,也可以简单的理解为,多了一层应用层。

interfaces->controller

application(新增)

service->domain

infrastructure->dao

map
    ┣ interfaces
    ┃ ┣ assembler
    ┃ ┃            
    ┃ ┣ controller                 #接口层,主要有接口和实现类型的相关转换(assembler)
    ┃ ┃ ┣ v1
    ┃ ┣ dto
    ┃ ┃ 
    ┣ application
    ┃ ┣ service                    #应用层主要用于组装各个领域实现业务,不参与具体业务的实现                                                        
    ┃ ┃ ┣ ...
    ┃ ┃ ┣ impl
    ┣ domain
    ┃ ┣ entity
    ┃ ┃ ┣ entity1                   #实体
    ┃ ┃ ┣ ...
    ┃ ┣ vo
    ┃ ┃ ┣                           #映射项值校验vo
    ┃ ┣ service
    ┃ ┃ ┣ service1                  #映射领域服务
    ┃ ┃ ┣ impl
    ┃ ┃ ┃ ┣ Impl1                   #映射领域服务实现
    ┃ ┃ ┃ ┣ ...
    ┃ ┣ repository
    ┃ ┃ ┣ ...
    ┣ infrastructure                #数据库交互,或各种工具类的视线层
    ┃ ┣ constant
    ┃ ┃ ┣ RedisKeyConstants
    ┃ ┣ mapper
    ┃ ┃ ┣ MappingHeaderMapper
    ┃ ┣ util
    ┃ ┃ ┣ util                       #工具类
resource
    ┣ mapper
    ┃ ┣ MappingValueRelationMapper.xml
    ┃ ┣ ...

遵循依赖倒置原则

  • 高层模块不应该过分的依赖底层模块,两者都应该依赖抽象.
  • 抽象不应该依赖于细节,细节应该依赖于抽象.

其他规范

1.固有的核心功能,放入领域中,而经常变动的可能变动的放在适配器中。

2.遵循单一职责。

具体实现代码

interfaces->controller

这一层是新增标签这个接口的实现,此时还未需要用到相关的实现类转换,如果传入的实体类是iconTag而需要的实体类是iconTagRemove,就可以在assembler中写入。

    /**
     * 新增标签
     * */
    @PostMapping(value = "/addIconTag")
    public IconTag addIconTag(@RequestBody IconTag iconTag){
        return baseIconService.addIconTag(iconTag);
    }

application->serviceimpl

这里主要是应用层,负责编排各个领域。

先到iconTag层拿到需要的iconType,在到Tag层去处理相关业务。

    @Override
    public IconTag addIconTag(IconTag iconTag) {
        if (StringUtils.isBlank(iconTag.getIconTagName())){
            throw new IconFontException(IconFontErrorCode.NAME_EMPTY);
        }
        iconTag.setIconTagName(StringUtils.deleteWhitespace(iconTag.getIconTagName()));
        iconTag = iconTypeService.addIconType(iconTag);
        return iconTagService.addIconTag(iconTag);
    }

domian ->serviceimpl

领域可以理解为编排各个数据库交互层,当业务很复杂的时候,也可以新增领域下的子域。如果这个领域需要实现的功能涉及到多个数据库层的操作,就可以。

 @Override
    public IconTag addIconTag(IconTag iconTag) {
       
        return iconTagDao.insert(iconTag);
    }

infrastructure->repository

数据库交互层,主要是用以数据库相关的操作。

        QueryWrapper<IconTag> queryWrapper = new QueryWrapper();
        queryWrapper.eq(IconCode.ICON_TAG_NAME,iconTag.getIconTagName());
        if(ObjectUtils.isNotEmpty(iconTagDao.selectList(queryWrapper))){
            throw new IconFontException(IconFontErrorCode.DUPLICATED_NAME);
        }
        handleDefaultData(iconTag);

        iconTagDao.insert(iconTag);
        return iconTagDao.selectById(iconTag.getId());

总结

DDD虽然架构层级上来说更多了,但是具体实现下来,特别是当业务越加越多的时候,就可以感觉到,比一般的三层架构的方式要清晰一些,但是还是有很多需要具体理解的方面,如什么是领域事件,其实感觉得到,业务过于简单的时候,是不太适合使用DDD的架构模式的,当业务比较复杂的时候,迭代比较多的时候就适合这种模式,后续还有很多优化的地方,此次只是首次实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch 新库 TorchMultimodal 使用说明:将多模态通用模型 FLAVA 扩展到 100 亿参数

先前的文章中&#xff0c;我们介绍了 TorchMultimodal&#xff0c;今天我们将从一个具体案例出发&#xff0c;演示如何在 Torch Distributed 技术加持下&#xff0c;在 TorchMultimodal 库中扩展多模态基础模型。 近年来&#xff0c;大模型已成为一个备受关注的研究领域。以自然…

GOM传奇引擎登录器商业版与免费版的区别

商业版与免费版登录器的区别&#xff1a; 1商业版自定义界面功能可以保存配置 2商业版登录器支持读取二次加密的Pak。需要购买Pak二次加密工具。 3商业版增加数字证书&#xff0c;防止杀毒软件误报 4商业版支持163博客远程列表&#xff0c;列表首尾需要$BEGIN $END关键字 5商业…

如何提高网站安全防护?

网站安全是网站建设后非常关键的一个问题&#xff0c;是不可以忽视的&#xff0c;一个安全性不高的网站对于网站的危害是很多的&#xff0c;网站安全性不高的网站容易被攻击、容易被挂马、容易造成网站数据泄露&#xff0c;下面安全狗小编来跟大家聊一下网站安全性该如何提高。…

Git常见操作

什么是Git 简单说&#xff0c;git就是版本管理工具。 Git解决的问题 试想一下&#xff0c;你是公司的设计人员。老板要求你设计一份海报。你花了3天时间&#xff0c;画好了&#xff0c;并命名为海报1.0.然后你给老板看&#xff0c;老板看了说“设计的很好&#xff0c;要是能…

将 Vue.js 项目部署至静态网站托管,并开启 Gzip 压缩

摘要&#xff1a;关于使用 Nginx 开启静态网站 Gzip 压缩的教程已经有很多了&#xff0c;但是好像没几个讲怎么在对象存储的静态网站中开启 Gzip 压缩。其实也不复杂&#xff0c;我们一起来看下~本文分享自华为云社区《将 Vue.js 项目部署至静态网站托管&#xff0c;并开启 Gzi…

基于模糊推理的滑膜控制

目录 前言 1.系统描述 2.控制器设计 3.模糊推理估计不确定f 3.1构造模糊系统 3.2模糊推理过程 3.3 自适应律设计 4.仿真分析 4.1仿真模型 4.2仿真结果 5.总结 前言 在一般的建模仿真中&#xff0c;我们假设模型都是可以用数学模型描述出来的是确定的&#xff0c;称…

Flink系列之Flink集群搭建

title: Flink系列 二、Flink集群搭建 2.1 Flink的Standalone模式集群安装 1、上传解压重命名 [roothadoop10 software]# tar -zxvf flink-1.14.3-bin-scala_2.12.tgz [roothadoop10 software]# mv flink-1.14.3 flink2、进入到解压之后的目录里面修改配置文件flink-conf.yam…

Hash 的定义

Hash&#xff0c;一般翻译做散列、杂凑&#xff0c;或音译为哈希。 这句话就是很多混乱的根源。 笔者还是比较时候直接使用 哈希这个翻译&#xff0c;或者干脆不翻译。 混乱来源 在查看很多资料的时候&#xff0c;经常会看到最多的一个词就是散列算法。 如果不深入追究下的…

PyQt5 数据库处理

PyQt5 数据库处理SQLite介绍连接数据库执行SQL语句创建SQLite数据库关闭窗口时断开SQLite连接数据库模型视图列表模式显示数据栅格模式分页显示数据SQLite介绍 SQLite是一个轻量级的数据库&#xff0c;实现了自给自足、无服务器、零配置、事务性的SQL数据库引擎。 下载地址 安…

深入理解ThreadLocal源码

1. 预备知识&#xff1a;强软弱虚引用 在Java中有四种引用的类型&#xff1a;强引用、软引用、弱引用、虚引用。 设计这四种引用的目的是可以用程序员通过代码的方式来决定对象的生命周期&#xff0c;方便GC。 强引用 强引用是程序代码中最广泛使用的引用&#xff0c;如下&a…

如何通过股票行情接口查询财务数据?

我们做交易&#xff0c;有时候还是需要用到一些上市公司的财务数据的&#xff0c;有什么板块可以快速获取财务数据呢&#xff1f;那肯定就是利用股票行情接口进行查询了&#xff0c;那具体要怎么做呢&#xff1f;下面这组代码可以了解一下&#xff1a; get_fundamentals - 查询…

Markdown格式表情包大全最新整理分享

Markdown表情包一、前言❤️二、Emoji表情大全&#x1f46e;People&#xff08;人物&#xff09;❄️Nature&#xff08;自然&#xff09;&#x1f514;Objects&#xff08;物体&#xff09;&#x1f3e0;Places&#xff08;地点&#xff09;&#x1f51f;Symbols&#xff08;符…

如何选择独立站ERP系统?

在选择ERP系统时所需要考虑以下几个问题&#xff0c;首先是看看ERP的操作流程是否简单明了。ERP最核心的作用就是提升工作效率&#xff0c;如果操作流程过于复杂&#xff0c;反倒是会增加学习成本&#xff0c;因此快速上手是先决条件。 其次便是需要看看功能是否符合卖家的需…

如何快速编辑图片?轻量级图片在线处理工具使用教程

不管在生活还是工作的时间里&#xff0c;图片都是经常会使用到的&#xff0c;但是可能在使用图片的时候&#xff0c;需要根据要求来做图片处理&#xff08;在线ps 图片编辑制作工具 免费照片编辑器_压缩图&#xff09;。比如我们常用的jpg、png、gif三种图片格式&#xff0c;经…

二叉树,平衡二叉树,B树,B+树,红黑树

1.普通树 A为整个树的根节点。而B&#xff0c;C&#xff0c;D可以看做子树的根节点&#xff0c;在下面分别长出三棵子树。 二、二叉树概念及结构 1.概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合或者为空&#xff0c;或者是由一个根节点加上两棵别称为左子树和右子…

Python Pubg 武器自动识别与压枪 全过程记录

博文目录 文章目录环境准备压枪原理需求分析求两张图片的相似度背包检测 是否在背包界面武器识别名称识别 纯白计数法配件识别 瞄具/枪口/握把/枪托 相似对比法模式识别 全自动/半自动/单发姿态识别 站/蹲/爬余弹识别激活识别 是否持有武器/一号武器/二号武器 (未完成, 做不下去…

Qt通过ODBC连接openGauss数据库

文章目录前言一、Qt链接测试1.测试代码2.测试效果二、环境搭建1.通过ODBC连接openGauss数据库2. 环境测试三、Qt通过ODBC操作数据库1.查询数据1.插入数据3.更新数据总结前言 本文就介绍了Qt通过ODBC连接opengauss数据库的基础内容。 一、Qt链接测试 1.测试代码 在.pro文件中…

java(面向对象)的23种设计模式(11)——观察者模式

一、定义 观察者模式&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 换种说法&#xff0c;定义两种对象&#xff0c;观察者和目标对象&#xff0c;多个观察者同时监听一个目标对…

高等数学基础概念的Python开发实现

一般的数学算式math函数库就可以解决了&#xff0c;如果是涉及到高等数学极限&#xff0c;微积分等知识&#xff0c;就需要用到sympy科学计算库&#xff0c;它是专门用来解决数学的运算问题的。 Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统&…

你的团队是王者还是青铜(上)

&#xff08;图片来源&#xff1a;https://unsplash.com/photos/RxOrX1iW15A&#xff09; 4月18日早上9点30分&#xff0c;团队跟着大屏计时器整齐地喊出倒计时&#xff0c;“五、四、三、二、一”&#xff0c;Tech Lead 强哥和 PO 小楠相对看了一眼&#xff0c;一起按下了eart…