架构中业务逻辑与数据校验定位:预算关闭校验的代码放置疑问
预算关闭操作的校验逻辑位置建议
必须把时间校验逻辑放在领域模型(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
相关产品推荐
相关产品推荐

