Skip to content

限界上下文映射(Bounded Context Mapping)

限界上下文映射(Bounded Context Mapping)是领域驱动设计中协调不同业务模块的核心技术,它就像一位经验丰富的城市设计师,帮助不同的业务模块在保持独立性的同时,又能和谐共处、高效协作。

通俗理解:业务模块的"外交关系"

  1. 城市交通规划

    • 道路系统:负责车辆通行
    • 地铁系统:负责轨道交通
    • 公交系统:负责公共交通
    • 需要协调:公交地铁换乘、道路施工影响等
  2. 企业部门协作

    • 销售部:负责客户签约
    • 财务部:负责收款开票
    • 生产部:负责产品制造
    • 需要协调:订单确认流程、付款状态同步等
  3. 国际外交关系

    • 不同国家有各自的法律体系
    • 贸易往来需要关税协定
    • 人员流动需要签证政策
    • 需要协调:双边协议、贸易争端解决机制

这些例子都展示了如何让不同系统/组织在保持独立性的同时有效协作。

主要特点

  1. 边界明确:每个上下文有清晰的职责范围
  2. 关系定义:明确上下文间的交互方式
  3. 转换机制:提供数据/概念的转换层
  4. 演进能力:支持上下文关系的动态调整

常见映射模式及实战案例

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;
            // ...其他状态映射
        }
    }
}

// 特点:
// - 隔离外部系统的不利影响
// - 进行数据转换和逻辑适配
// - 适合集成遗留系统或第三方服务

设计原则与实战建议

  1. 明确边界 - 画好"国界线"

    • 使用上下文映射图可视化边界
    • 示例:用不同颜色标注核心/支撑/通用子域
    • 工具推荐:C4模型、上下文映射画布
  2. 最小耦合 - 保持适当距离

    • 优先使用事件驱动(Domain Events)
    • 示例:订单创建后发布事件,而非直接调用
    • 避免:双向依赖、循环依赖
  3. 契约优先 - 先签协议再合作

    • 定义清晰的接口规范(Swagger/Protobuf)
    • 示例:库存服务的API版本控制
    • 包含:
      • 数据格式
      • 错误码规范
      • 性能SLA
  4. 演进设计 - 预留调整空间

    • 采用防腐层隔离易变系统
    • 示例:支付渠道变更只需修改适配层
    • 策略:
      • 为新关系预留扩展点
      • 定期评审映射关系
  5. 监控与治理 - 关系维护

    • 跟踪跨上下文调用的健康度
    • 指标示例:
      • 调用成功率
      • 平均延迟
      • 超时比率
    • 工具:Prometheus + Grafana