快速开始
5 分钟跑通你的第一个 Pragmatic DDD 聚合根。
前置:当前版本尚未发布到 Maven 中央仓库
pragmatic-ddd 目前未发布到中央仓库,直接引入坐标会拉取失败。请先完成下面的 §0 本地安装,将框架安装到你本地的 ~/.m2 仓库后,再按 §1 引入依赖即可正常使用。
0. 本地安装(未发布中央仓库时)
① 下载源代码:从仓库克隆 / 下载 pragmatic-ddd 源码到本地。
② 打包并本地安装:进入工程根目录(含 install-local.sh),执行:
bash
./install-local.sh # 全量打包并安装 7 个框架模块到本地 ~/.m2 仓库- 脚本内部执行
mvn -f pom.xml install,等价于「源码 package 打包 + install 到本地仓库」; - 默认跳过单元测试执行(
-DskipTests),避免测试依赖外部环境导致安装失败; - 若本机无
~/.m2之外的特别配置,安装完成后可用mvn -v确认环境,再验证本地仓库:
bash
# 验证是否已安装成功(应能看到 io/pragmatic/ddd 相关坐标)
ls ~/.m2/repository/io/pragmatic/ddd/pragmatic-ddd-core/2.0.0/该脚本还支持选择性安装与连带示例构建,详见仓库根目录
install-local.sh头部注释,或查看 仓库安装到本地仓库说明。
1. 引入依赖
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.pragmatic.ddd</groupId>
<artifactId>pragmatic-ddd-bom</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.pragmatic.ddd</groupId>
<artifactId>pragmatic-ddd-core</artifactId>
</dependency>
</dependencies>2. 定义聚合根
java
import io.pragmatic.ddd.base.*;
import io.pragmatic.ddd.operation.OperationRegistry;
public class Order extends AggregateRoot<Long> {
private String customerName;
private long amount;
private String status;
public Order(Long id, String customerName, long amount) {
this.setEntityId(id);
this.customerName = customerName;
this.amount = amount;
this.status = "CREATED";
this.markNew(); // 标记为新建,仓储据此走 insert
this.markCreated(); // 填充审计时间
}
// 业务方法
public void cancel() {
this.status = "CANCELLED";
this.markModified();
this.getNewVersion(); // 触发版本递增
this.recordOperation(OrderOperationRegistry.CANCEL);
this.collectEvent(new OrderCancelledEvent(this.getEntityId()));
}
// --- 框架要求的两个抽象方法 ---
@Override
protected BrokenRuleRegistry brokenRuleRegistry() {
return OrderRuleRegistry.INSTANCE;
}
@Override
protected OperationRegistry operationRegistry() {
return OrderOperationRegistry.INSTANCE;
}
// getter 省略
public long getAmount() { return amount; }
public String getStatus() { return status; }
}3. 定义规则
java
// 3.1 消息码注册表(注意:必须是 public)
public class OrderRuleRegistry extends BrokenRuleRegistry {
public static final MessageCode AMOUNT_POSITIVE =
MessageCode.of("ORDER_AMOUNT_POSITIVE", "订单金额必须大于0");
public static final OrderRuleRegistry INSTANCE = new OrderRuleRegistry();
}
// 3.2 规则容器
public class OrderRule extends EntityRule<Order> {
public OrderRule() {
super(true); // failFast=true
init();
}
@Override
protected void init() {
addRule((order, old) ->
order.getAmount() > 0 ? RuleCheckResult.pass()
: RuleCheckResult.fail(),
OrderRuleRegistry.AMOUNT_POSITIVE);
}
}4. 定义领域事件
java
import io.pragmatic.ddd.event.BaseDomainEvent;
public class OrderCancelledEvent extends BaseDomainEvent {
public OrderCancelledEvent(String entityId) {
super(entityId); // 自动生成 eventId + 时间戳
}
}5. 定义仓储
java
public class OrderRepository implements IRepository<Long, Order> {
@Override
public void insert(Order order) { /* INSERT ... */ }
@Override
public void update(Order order) { /* UPDATE ... WHERE version = oldVersion */ }
@Override
public Order findById(Long id) { /* SELECT ... */ return null; }
@Override
public void remove(Order order) { /* DELETE ... */ }
}6. 执行命令
java
// 1. 构建聚合根
Order order = new Order(1L, "张三", 100);
// 2. 构建命令执行器(需要 IEventManager,这里用本地实现示意)
IEventManager eventManager = new ThreadPoolEventManager(LocalEventManagerConfig.defaultConfig());
eventManager.start();
CommandExecutor executor = new CommandExecutor(eventManager);
OrderRepository repository = new OrderRepository();
OrderRule rule = new OrderRule();
// 3. 执行:领域逻辑 → 规则校验 → 落库 → 发布事件 → 清空
Order result = executor.execute(order, rule, repository, Order::cancel);
// 4. 关闭
eventManager.shutdown();7. 运行结果
执行流程按固定模板进行:
1. 领域逻辑 → order.cancel():修改状态、记录操作、收集事件
2. 规则校验 → order.satisfiesRule(rule):校验金额 > 0
3. 落库 → repository.save(order):因 isNew=true 走 insert
4. 发布事件 → eventManager.publish(OrderCancelledEvent)
5. 清空状态 → order.clearWorkUnitState()试跑(Dry-run)
如果只想校验不落库,用 executor.tryExecute(order, rule, repository, Order::cancel),返回 DryRunResult,零副作用。
下一步: