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

DDD领域模型跨层引用问题:推送通知场景实现方案

DDD架构下推送通知场景的分层落地方案

问题1:PushNotificationSender分层归属与依赖矛盾解决

  • 核心原则先明确:PushNotificationSender的抽象接口定义归属Domain Layer(领域层),具体发送逻辑的实现类才归属Infrastructure Layer(基础设施层)。这个矛盾的核心是混淆了接口与实现的分层归属。
  • DDD的依赖规则从来不是“领域层不能调用任何外部逻辑”,而是“领域层不能依赖外层的具体实现,只能依赖自身定义的抽象”。你只需要把PushNotificationSender接口放在领域层,定义好send(PushNotification notification)这类带业务语义的方法,具体的APNs/FCM/厂商推送通道实现放在基础设施层,通过依赖注入把实现实例传给上层即可,完全不违反分层规则。
  • 你判断的“推送触发时机、接收对象判定归属领域层”是完全正确的:比如判定“用户完成训练后要给关注者发推送”“训练提醒只能发给设置提醒的用户本人”这类纯业务规则,全部放在领域层实现,领域层构造好合法的PushNotification聚合后,直接调用自身定义的PushNotificationSender接口提交发送请求即可,不需要关心底层怎么把消息送到用户设备上。
  • 这里要纠正一个常见认知偏差:“发送推送是业务需求”不代表“推送的技术实现细节属于领域层”。领域层只需要决策“要不要发、发给谁、发什么”,至于消息走哪个通道、失败怎么重试、流量怎么控制这类技术问题,全是基础设施层的职责,和业务规则无关。

问题2:指定日期定时推送的分层设计

  • 不要把“定时调度”这种技术能力的实现塞进领域层,领域层不需要关心“怎么到点触发任务”,只需要关心“定时推送的业务规则是什么”。按下面的分层拆分就不会出现依赖倒置问题:
    • 领域层:定义ScheduledPushNotification聚合,包含关联的推送内容、计划发送时间、接收人列表、推送状态(待发送/已发送/已取消)等核心业务属性;定义ScheduledPushNotificationRepository抽象接口,声明“保存定时推送”“查询到期待发送推送”“更新推送状态”等业务需要的方法;同时在领域服务/聚合方法里封装所有业务校验规则:比如计划发送时间不能早于当前时间、已取消的推送不能发送、非本人设置的提醒无效等。
    • 应用层:只做流程编排。接收用户提交的定时推送/训练提醒设置请求后,调用领域层的工厂/聚合方法构造合法的ScheduledPushNotification实例(构造过程中领域层自动完成所有业务校验,不合法直接抛出业务异常),再调用ScheduledPushNotificationRepository抽象接口完成持久化;另外提供一个供定时任务回调的发送入口,接收到期推送任务后,调用领域层逻辑二次校验任务有效性,校验通过则触发推送发送。
    • 基础设施层:负责实现所有技术细节。一是实现ScheduledPushNotificationRepository接口,完成数据的数据库持久化;二是实现定时调度能力,不管是用本地定时任务、分布式调度框架还是云厂商的延时消息服务,定期扫描到期的待发送推送,把任务传给应用层的回调入口即可;三是实现PushNotificationSender接口,对接实际推送通道完成消息下发。
  • 这套分层下,所有业务规则全部收敛在领域层,领域层不依赖任何外层的具体实现,外层(应用层、基础设施层)向内依赖领域层的抽象,完全符合DDD的分层原则。

健身类APP两个核心用例的落地参考

  • 用例1:用户完成训练后给关注者发推送
    • 领域层TrainingRecord聚合在调用complete()方法标记训练完成时,抛出TrainingCompletedEvent领域事件
    • 领域层的事件处理器订阅该事件,执行纯业务逻辑:查询当前训练所属用户的所有有效关注者ID,构造对应内容的PushNotification聚合实例,调用PushNotificationSender接口提交发送请求
    • 基础设施层的PushNotificationSender实现收到请求后,对接对应推送通道完成下发,同时记录发送日志、处理重试等技术逻辑
  • 用例2:用户设置训练提醒,到点推送
    • 应用层接收用户提交的提醒设置参数(提醒时间、提醒内容),调用领域层TrainingReminder聚合的工厂方法创建实例,领域层自动完成业务校验(比如提醒时间不能为过去时间、不能给其他用户设置提醒)
    • 校验通过后,应用层构造关联的ScheduledPushNotification实例,调用Repository接口完成持久化
    • 基础设施层定时任务扫描到到期的提醒任务后,回调应用层发送入口,应用层调用领域层逻辑校验提醒是否仍有效(比如用户已经取消提醒、已经完成对应时段训练则终止发送),校验通过后调用PushNotificationSender完成推送

内容的提问来源于stack exchange,提问作者J. Meier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:42:30