限界上下文映射(Bounded Context Mapping)
限界上下文映射(Bounded Context Mapping)是领域驱动设计中协调不同业务模块的核心技术,它就像一位经验丰富的城市设计师,帮助不同的业务模块在保持独立性的同时,又能和谐共处、高效协作。
通俗理解:业务模块的"外交关系"
城市交通规划
- 道路系统:负责车辆通行
- 地铁系统:负责轨道交通
- 公交系统:负责公共交通
- 需要协调:公交地铁换乘、道路施工影响等
企业部门协作
- 销售部:负责客户签约
- 财务部:负责收款开票
- 生产部:负责产品制造
- 需要协调:订单确认流程、付款状态同步等
国际外交关系
- 不同国家有各自的法律体系
- 贸易往来需要关税协定
- 人员流动需要签证政策
- 需要协调:双边协议、贸易争端解决机制
这些例子都展示了如何让不同系统/组织在保持独立性的同时有效协作。
主要特点
- 边界明确:每个上下文有清晰的职责范围
- 关系定义:明确上下文间的交互方式
- 转换机制:提供数据/概念的转换层
- 演进能力:支持上下文关系的动态调整
常见映射模式及实战案例
1. 合作关系(Partnership)
java
// 电商平台案例:订单与支付上下文紧密合作
class OrderContext {
// 直接注入支付服务
@Autowired
PaymentService paymentService;
public void completeOrder(Order order) {
// 订单完成后立即调用支付
paymentService.processPayment(order);
}
}
// 特点:
// - 两个上下文共同承担业务责任
// - 需要保持较高的一致性
// - 适合核心业务关联紧密的场景
2. 客户-供应商(Customer-Supplier)
java
// 库存管理系统案例
public interface InventoryService {
// 定义清晰的供应契约
boolean reserveInventory(String sku, int quantity);
boolean cancelReservation(String reservationId);
List<InventoryItem> queryInventory(InventoryQuery query);
}
// 订单系统作为客户调用
class OrderService {
@Autowired
InventoryService inventoryService;
public Order createOrder(Cart cart) {
// 调用库存服务预留库存
boolean success = inventoryService.reserveInventory(
cart.getSku(), cart.getQuantity());
// ...
}
}
// 特点:
// - 明确的上下游关系
// - 供应商定义接口,客户遵守契约
// - 适合单向依赖的业务场景
3. 防腐层(Anticorruption Layer)
java
// 新旧系统迁移案例
class LegacyOrderAdapter {
// 转换旧系统订单数据
public Order adapt(LegacyOrder legacyOrder) {
Order order = new Order();
// 字段映射与转换
order.setId(legacyOrder.getOrderNo());
order.setStatus(convertStatus(legacyOrder.getState()));
// 复杂逻辑处理
if(legacyOrder.isUrgent()) {
order.setPriority(OrderPriority.HIGH);
}
return order;
}
private OrderStatus convertStatus(int legacyStatus) {
// 状态枚举转换
switch(legacyStatus) {
case 1: return OrderStatus.PENDING;
case 2: return OrderStatus.PAID;
// ...其他状态映射
}
}
}
// 特点:
// - 隔离外部系统的不利影响
// - 进行数据转换和逻辑适配
// - 适合集成遗留系统或第三方服务
设计原则与实战建议
明确边界 - 画好"国界线"
- 使用上下文映射图可视化边界
- 示例:用不同颜色标注核心/支撑/通用子域
- 工具推荐:C4模型、上下文映射画布
最小耦合 - 保持适当距离
- 优先使用事件驱动(Domain Events)
- 示例:订单创建后发布事件,而非直接调用
- 避免:双向依赖、循环依赖
契约优先 - 先签协议再合作
- 定义清晰的接口规范(Swagger/Protobuf)
- 示例:库存服务的API版本控制
- 包含:
- 数据格式
- 错误码规范
- 性能SLA
演进设计 - 预留调整空间
- 采用防腐层隔离易变系统
- 示例:支付渠道变更只需修改适配层
- 策略:
- 为新关系预留扩展点
- 定期评审映射关系
监控与治理 - 关系维护
- 跟踪跨上下文调用的健康度
- 指标示例:
- 调用成功率
- 平均延迟
- 超时比率
- 工具:Prometheus + Grafana