<basePackage>org.netcorepal.cap4j.ddd.example</basePackage>
mvn cap4j-ddd-codegen:gen-arch
基于基础包路径配置,cap4j-ddd-codegen
插件在maven项目源码目录src/main/java/org/netcorepal/cap4j/ddd/example
下将会生成4个package
。
_share
公共代码adapter
适配层(Interface Adapter)application
应用层(Application Business Rules)domain
领域层(Enterpprise Business Rules)
以上代码分层完全遵循整洁架构对于代码分层组织的观点。 当然,如果你有自己的理解,插件也支持完全自主的自定义模板,仅需自己修改脚手架模板cap4j-ddd-codegen-template.json并应用即可。
实现领域模型,聚合、实体、领域事件以及集成事件定义。
└── org.netcorepal.cap4j.ddd.example
└── domain
├── _share (领域层公共代码,仅供领域层引用)
├── aggregates (聚合)
└── services (领域服务)
聚合内部包定义。
└── aggregates
└── order
├── Order.java (聚合根)
├── OrderItem.java (实体)
├── enums (枚举)
│ └── OrderStatus.java
├── events (领域事件)
│ └── OrderPlacedDomainEvent.java
├── factory (聚合工厂)
│ ├── OrderFactory.java (聚合工厂类)
│ └── OrderPayload.java (工厂负载)
├── schemas
│ ├── OrderItemSchema.java
│ └── OrderSchema.java
└── specs (实体规格约束)
└── OrderSpecification.java
实现CQS
模式,将功能用例(UseCase
)抽象成命令(Command
)或查询(Query
)来实现。
└── org.netcorepal.cap4j.ddd.example
└── application
├── _share (应用层公共代码,仅供领域层引用)
│ └── enums (应用层枚举类型)
├── clients (防腐层:包装三方服务调用接口)
├── commands (CQS的C:命令)
├── distributed (分布式)
├ ├── events (声明三方服务集成事件)
│ └── sagas (SAGA是一种分布式事务最终一致性方案)
├── queries (CQS的Q:查询)
└── subscribers (事件的订阅处理逻辑,或者称为eventhandlers)
├── domain (领域事件订阅处理逻辑)
└── integration (集成事件订阅处理逻辑)
如适配
字面意思,放置各层(领域层domain
、应用层application
)定义的接口实现。整洁架构中称其为接口适配层(Interface Adapters
)。
该层是领域层和应用层业务逻辑所依赖抽象接口
的技术适配实现,适配层设计是DI原则的实践。
举个例子来理解抽象接口,比如我们常见的电商场景,用户在商城下单,需要通知仓库打包发货。那么这个通知
可能就会需要抽象出一个通知功能接口
,来承接下单流程的顺利进行。
通知功能接口的定义(方法签名、入参、出参等)是应用层关心的事。但是通知功能接口如何实现,就是适配层的事了,通过短信也好、电话也好,能够实现通知功能接口定义的核心效果即可。
└── org.netcorepal.cap4j.ddd.example
└── adapter
├── _share (适配层公共代码,仅供适配层引用)
│ └── configure
│ └── ApolloConfig.java (配置中心)
├── application (应用层接口实现)
│ ├── _share
│ │ └── configure
│ │ └── MyIntegrationEventInterceptor.java (集成事件拦截器)
│ ├── distributed
│ │ └── clients (防腐端实现)
│ └── queries (查询请求适配实现)
├── domain (领域层接口实现)
│ ├── _share
│ │ └── configure
│ │ ├── MyDomainEventInterceptor.java (领域事件拦截器)
│ │ └── MyEventMessageInterceptor.java (事件消息拦截器)
│ └── repositories (实现聚合仓储接口)
├── infra (基础设施适配接口实现)
│ ├── _share
│ ├── jdbc (服务于应用层CQS的Q,jdbc查询工具类)
│ │ └── NamedParameterJdbcTemplateDao.java
│ └── mybatis (服务于应用层CQS的Q,mybatis集成)
│ ├── _share
│ │ └── MyEnumTypeHandler.java
│ └── mapper
└── portal (端口)
├── api (SpringMVC相关代码)
│ ├── TestController.java
│ └── _share
│ ├── ResponseData.java
│ ├── Status.java
│ └── configure
│ ├── CommonExceptionHandler.java
│ ├── MvcConfig.java
│ └── SwaggerConfig.java
├── jobs (定时任务相关代码)
│ └── _share
│ └── configure
│ └── XxlJobConfig.java
└── queues (消息队列相关代码)
放置公共代码。
└── org.netcorepal.cap4j.ddd.example
└── _share
├── CodeEnum.java (响应状态码枚举)
├── Constants.java (公共常量)
└── exception (自定义业务异常)
├── ErrorException.java
├── KnownException.java
└── WarnException.java
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── netcorepal
│ │ └── cap4j
│ │ └── ddd
│ │ └── example
│ │ ├── StartApplication.java
│ │ ├── _share
│ │ │ ├── CodeEnum.java
│ │ │ ├── Constants.java
│ │ │ └── exception
│ │ │ ├── ErrorException.java
│ │ │ ├── KnownException.java
│ │ │ └── WarnException.java
│ │ ├── adapter
│ │ │ ├── _share
│ │ │ │ └── configure
│ │ │ │ └── ApolloConfig.java
│ │ │ ├── application
│ │ │ │ ├── _share
│ │ │ │ │ └── configure
│ │ │ │ │ └── MyIntegrationEventInterceptor.java
│ │ │ │ ├── distributed
│ │ │ │ │ └── clients (防腐端实现)
│ │ │ │ └── queries (查询请求适配实现)
│ │ │ ├── domain
│ │ │ │ ├── _share
│ │ │ │ │ └── configure
│ │ │ │ │ ├── MyDomainEventInterceptor.java
│ │ │ │ │ └── MyEventMessageInterceptor.java
│ │ │ │ └── repositories
│ │ │ ├── infra
│ │ │ │ ├── _share
│ │ │ │ ├── jdbc
│ │ │ │ │ └── NamedParameterJdbcTemplateDao.java
│ │ │ │ └── mybatis
│ │ │ │ ├── _share
│ │ │ │ │ └── MyEnumTypeHandler.java
│ │ │ │ └── mapper
│ │ │ └── portal
│ │ │ ├── api
│ │ │ │ ├── TestController.java
│ │ │ │ └── _share
│ │ │ │ ├── ResponseData.java
│ │ │ │ ├── Status.java
│ │ │ │ └── configure
│ │ │ │ ├── CommonExceptionHandler.java
│ │ │ │ ├── MvcConfig.java
│ │ │ │ └── SwaggerConfig.java
│ │ │ ├── jobs
│ │ │ │ └── _share
│ │ │ │ └── configure
│ │ │ │ └── XxlJobConfig.java
│ │ │ └── queues
│ │ ├── application
│ │ │ ├── _share
│ │ │ │ └── enums
│ │ │ │── commands
│ │ │ ├── distributed
│ │ ├ │ ├── events
│ │ │ │ └── sagas
│ │ │ ├── queries
│ │ │ └── subscribers
│ │ │ ├── domain
│ │ │ └── integration
│ │ └── domain
│ │ ├── _share
│ │ ├── aggregates
│ │ │ └── order (示例聚合)
│ │ │ ├── Order.java (聚合根)
│ │ │ ├── OrderItem.java (实体)
│ │ │ ├── enums (枚举)
│ │ │ │ └── OrderStatus.java
│ │ │ ├── events (领域事件)
│ │ │ │ └── OrderPlacedDomainEvent.java
│ │ │ ├── factory (聚合工厂)
│ │ │ │ ├── OrderFactory.java (聚合工厂类)
│ │ │ │ └── OrderPayload.java (工厂负载)
│ │ │ ├── schemas
│ │ │ │ ├── OrderItemSchema.java
│ │ │ │ └── OrderSchema.java
│ │ │ └── specs (实体规格约束)
│ │ │ └── OrderSpecification.java
│ │ └── services
│ └── resources
│ ├── mapper
│ ├── application.properties
│ ├── ddl.sql
│ └── logback.xml
└── test
└── java
└── org
└── netcorepal
└── cap4j
└── ddd
└── example
└── AppTest.java