• DDD的落地,需要基础设施的大力支持


    1. 概览

    对于复杂业务,DDD 绝对是一把神器,由于它过于复杂,很多人望而却步。因为太过严谨,形成了很多设计模式、规范化流程,这些爆炸的信息已经成为 DDD 落地的重大阻力。

    但,如果我们将这些规范化的流程封装到框架,仅把核心业务逻辑暴露给开发人员,又会是什么样子?

    1.1. 背景

    在尝试使用 DDD 处理复杂业务之后,就难以回到 CRUD 的世界。相对于 CRUD 来说,DDD 具备一套完整的理论基础,提供了一组业务模式和规范用以应对复杂的业务流程。但,由于其概念繁多,通常还过于抽象,存在一定的门槛;加上过于规范,业务流程被拆分多个组件,大大增加了理解成本,也加大了开发人员的代码量。

    好在,由于规范所以产生了大量的最佳实践,日常开发中的众多业务场景均可完成抽象化、模板化甚至清单化,开发人员只需照“猫画虎”便可以完成DDD落地。而这些最佳实践,最好能够以“基础设施”的方式进行支持,降低入门门槛,提升开发效率。

    1.2. 目标

    1. 将模板流程全部内置于框架,让业务开发人员将更多的精力聚焦于领域模型;
    2. 支持领域模型的 创建 和 更新 两大业务场景,只做接口定义,不编写流程代码;
    3. 核心流程需具备 参数校验、业务规则验证、Command 和 Context 转换,状态持久化、领域事件发布等通用能力;
    4. 支持自定义流程,对于个性化场景,可通过编码方式完成业务流程,并快速与 CommandService 进行集成;

    2. 快速入门

    在设计上,CommandService 借鉴了 Spring Data 核心理念,在使用上也与 Spring Data 保存一致,以降低使用门槛。

    2.1. 环境搭建

    首先,在项目中引入 lego-starter,具体如下:

    1. <dependency>
    2.     <groupId>com.geekhalo.lego</groupId>
    3.     <artifactId>lego-starter</artifactId>
    4.     <version>0.1.10-command_service-SNAPSHOT</version>
    5. </dependency>

    然后,依次引入 validation 和 spring data jpa 支持

    1. <dependency>
    2.     <groupId>org.springframework.boot</groupId>
    3.     <artifactId>spring-boot-starter-validation</artifactId>
    4. </dependency>
    5. <dependency>
    6.     <groupId>org.springframework.boot</groupId>
    7.     <artifactId>spring-boot-starter-data-jpa</artifactId>
    8. </dependency>

    在 application 文件中添加 Datasource 配置:

    1. spring:
    2.   datasource:
    3.     driver-class-name: com.mysql.cj.jdbc.Driver
    4.     url: jdbc:mysql://127.0.0.1:3306/lego
    5.     username: root
    6.     password: root
    7.   jpa:
    8.     hibernate:
    9.       ddl-auto: update
    10.     show-sql: true

    新增
    SpringDataJpaConfiguration 配置类,完成对 spring data jpa 的配置,具体如下:

    1. @Configuration
    2. @EnableJpaRepositories(basePackages = {"com.geekhalo.lego.command"})
    3. public class SpringDataJpaConfiguration {
    4. }

    新增
    CommandServiceConfiguration 配置类,完成对 CommandService 的配置,具体如下:

    1. @Configuration
    2. @EnableC
  • 相关阅读:
    GoLong的学习之路(二十三)进阶,语法之并发(go最重要的特点)(锁,sync包,原子操作)
    Linux命令从入门到实战 ---- 磁盘管理类
    数据库、计算机网络,操作系统刷题笔记7
    【重铸Java根基】J集合相关知识点
    【JavaSE】文件与IO流
    Android | ADB 命令
    面试算法-数据结构二
    Python实现Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换
    【Qt6.3基础教程01】 Qt简介与环境搭建
    如何有效的发挥员工的积极性、主动性和创造性?
  • 原文地址:https://blog.csdn.net/m0_74931226/article/details/127883534