对于复杂业务,DDD 绝对是一把神器,由于它过于复杂,很多人望而却步。因为太过严谨,形成了很多设计模式、规范化流程,这些爆炸的信息已经成为 DDD 落地的重大阻力。
但,如果我们将这些规范化的流程封装到框架,仅把核心业务逻辑暴露给开发人员,又会是什么样子?
在尝试使用 DDD 处理复杂业务之后,就难以回到 CRUD 的世界。相对于 CRUD 来说,DDD 具备一套完整的理论基础,提供了一组业务模式和规范用以应对复杂的业务流程。但,由于其概念繁多,通常还过于抽象,存在一定的门槛;加上过于规范,业务流程被拆分多个组件,大大增加了理解成本,也加大了开发人员的代码量。
好在,由于规范所以产生了大量的最佳实践,日常开发中的众多业务场景均可完成抽象化、模板化甚至清单化,开发人员只需照“猫画虎”便可以完成DDD落地。而这些最佳实践,最好能够以“基础设施”的方式进行支持,降低入门门槛,提升开发效率。
在设计上,CommandService 借鉴了 Spring Data 核心理念,在使用上也与 Spring Data 保存一致,以降低使用门槛。
首先,在项目中引入 lego-starter,具体如下:
- <dependency>
- <groupId>com.geekhalo.lego</groupId>
- <artifactId>lego-starter</artifactId>
- <version>0.1.10-command_service-SNAPSHOT</version>
- </dependency>
然后,依次引入 validation 和 spring data jpa 支持
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-validation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
在 application 文件中添加 Datasource 配置:
- spring:
- datasource:
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://127.0.0.1:3306/lego
- username: root
- password: root
- jpa:
- hibernate:
- ddl-auto: update
- show-sql: true
新增
SpringDataJpaConfiguration 配置类,完成对 spring data jpa 的配置,具体如下:
- @Configuration
- @EnableJpaRepositories(basePackages = {"com.geekhalo.lego.command"})
- public class SpringDataJpaConfiguration {
- }
新增
CommandServiceConfiguration 配置类,完成对 CommandService 的配置,具体如下:
- @Configuration
- @EnableC