热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零开始领域驱动划分代码层次

开头说两句博客地址: https://www.lixiang.red公众号: 程序员心情站项目背景不知从何时开始,业内慢慢开始有了领域驱动的声音,刚好公司有些新项目要做,就借着DDD的浪潮,新项目,
开头说两句

博客地址: https://www.lixiang.red
公众号: 程序员心情站

项目背景

不知从何时开始,业内慢慢开始有了领域驱动的声音,刚好公司有些新项目要做,就借着DDD的浪潮,新项目,新技术选型

学习调研时遇到的问题

国内关于DDD的书和视频真心不怎么多,听说阿里盒马对DDD有着深入的使用,但也没什么资料流出,网上为数不多的两本书,一本红皮书,像天书一样,啃了几天,啃不下去,还有本稍好一点,也不是太好理解,大致翻了一遍后还是有点蒙,还是动手写代码吧,边写边思考,边改进, 在学习过程中主要有以下思考阶段
1. 在实际编码中,如果代码如何分层
2. DDD是以业务为主,那么如果去划分业务上下界
3. DDD提倡了一种专家和开发人员都能理解的语言,那么如何去把这种新语言沉淀下来
等等…

对领域驱动的理解

有句笑谈是,没有加个中间表解决不了的业务,如果有,就加两张. 虽说领域驱动是以业务为主,但是落叶归根也是要建库建表的.那么我们新引入的领域驱动的概念就是加在数据库表和Manage层的中间件.
以小刀现在负责的用户模块为例,我们先业务建模,小刀是按经典的三户模型进行设计的:客户-用户-账户.
1. 客户
是指自然人,只要点了我们系统的,就是我们的客户,不管是看了一眼还是点了一下.
2. 用户
指不仅仅看了我们的系统,还和我们系统产生了业务数据
3. 账户
原指金额行业中用来为用户销账的账户,在我们系统中,小刀修改成通行证的概念.即,一个通行证,可以对应多个用户.
举个例子就是:小刀我是一个客户,我手里面两个通行证,一个是公司APP的通行证,一个是公司后台管理系统的通行证. APP通行证下面有我的微信账号,手机账号. 管理系统通行证下面有A管理系统,B管理系统的权限这样
那么按照这三户的业务,他们实际上是属于同一个领域,但是有三张数据库表. 对领域驱动的理解总结起来就是: 一个领域对应多张表. 外层(service , manager) 从dao层拿了数据之后,业务都要通过领域层来处理.

领域驱动对应的代码分层

为什么修改代码分层呢,那肯定是以前的不好才会改,那以前的怎么不好了呢,我们来一起看下以前的代码分层

经典的代码分层结构

以前的经典分层是 controller 调用 manager/service , 然后service调用dao , dao层去数据库取数据,然后service里面对数据进行业务加工,然后返回给controller , controller 给包一个BaseResponse之类的,加上状态码,信息之类的然后返回给调用方.
这样写也没什么不好的, 但有时候逻辑写的时候清楚,过段时间回来再看就无从下手了,最主要的原因是代码没有根着业务走,只是拼出了业务想要的数据而已

新的代码分层结构

其实新也新不到哪去,下面这个分层结构是小刀结合看的书自己琢磨出来的,有不全之处,欢迎大家一起来讨论

如上图所示,其实这里已经欠下了技术债(passport,account概念混乱了),但是代码一期已经上线了,jar包也打出去了,不好再更改了.

DAO层

这层和以前代码一样,采用Mybatis实现的,只不过小刀这里用的是mybatis新的provider方式,没有用xml去写sql,这里其实有点小纠结,就是 redis/缓存 算不算DAO层的范围.因为我们也是从redis中去做数据的存取.考量再三还是没有把redis归到DAO层,而是归到了领域层里面,因为redis里面都是业务数据

domain层

这一层是重点了,在这一层抽象出了四个主要的概念
1. 领域配置对象: PassportConfig
这里从apollo上获取一些项目业务配置信息
2. 领域规则对象: PassportSpec
这里面主要是对参数,验证码,节点值做检验,业务可以进行的,返回 true/false ,业务不能进行的,就抛出 RuntimeException
3. 领域缓存对象: PassportRedis
如名,对redis的操作和存取
4. 领域充血对象:AccountRich(现在想应该是PassportRich)
这里面封装了以上三个对象来进行业务操作

manage层

在这一层,如上图所示,每个方法都是大体这几步
1. 通过mapper从数据库取出业务实体对象
2. 把业务实体对象做为根传入充血对象
3. 对充血对象进行各种业务操作
4. 最后调用 2dto方法,返回一个值对象给调用方

最后说两句

领域驱动这块小刀还在不停的实践中,大家有什么想法和小刀一起讨论的可以加小刀微信: best396975802

点击阅读原文,查看更多文章


推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本文以 www.域名.com 为例,详细介绍如何为每个注册用户提供独立的二级域名,如 abc.域名.com。实现这一功能的核心步骤包括:首先,确保域名支持泛解析,即将 A 记录设置为 *.域名.com,以便将所有二级域名请求指向同一服务器。接着,在服务器端使用 ASP.NET 2.0 进行配置,通过解析 HTTP 请求中的主机头信息,动态识别并处理不同的二级域名,从而实现个性化内容展示。此外,还需在数据库中维护用户与二级域名的对应关系,确保每个用户的二级域名都能正确映射到其专属内容。 ... [详细]
  • 利用 Zend Framework 实现高效邮件发送功能 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ... [详细]
author-avatar
文文的爱天使_152
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有