You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

架构中业务逻辑与数据校验定位:预算关闭校验的代码放置疑问

预算关闭操作的校验逻辑位置建议

必须把时间校验逻辑放在领域模型(Budget类)中,原因如下:

  • 这是核心业务规则,领域模型要对自身的状态一致性负责。预算的关闭操作本身就绑定“仅生效时段可关闭”的规则,模型必须自己守护这个约束——如果把校验放在控制器,后续其他场景(比如服务层内部调用、定时任务触发)直接调用Budget的close方法时,就会绕过规则,导致数据不一致。

  • 控制器的职责是处理请求层面的校验,比如参数格式合法性、用户操作权限、请求资源是否存在等,不该介入核心业务逻辑。而且你提到“尚未掌握全部业务规则”,把规则收敛在领域模型里,后续修改或扩展时只需改动模型,不用在多个控制器里找零散的校验逻辑,维护成本更低。

另外你提供的代码里isOnPeriod的判断逻辑存在错误,修正后的示例代码如下:

class Budget {
  // 假设已有opening_date、closing_date、closed等属性

  public close(): void {
    this.isOnPeriod();
    this.closed = true;
  }

  private isOnPeriod(): void {
    const now = new Date();
    if (now < this.opening_date) {
      throw new BudgetIsNotYetOpen();
    }
    if (now > this.closing_date) {
      throw new BudgetIsClosedError();
    }
  }
}

当然,控制器可以做前置的快速拦截(比如先检查预算是否存在、用户是否有权限),但核心的业务规则校验必须由领域模型完成,这是领域驱动设计中“领域模型自治”的基本要求。

内容的提问来源于stack exchange,提问作者Bernardo Benini Fantin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:32:11