DDD与六边形架构下,TypeScript项目中观察者模式的分层困惑
观察者模式在DDD+六边形架构中的放置建议
核心判断依据
观察者模式的归属,本质取决于它服务的是领域逻辑还是应用编排逻辑:
1. 服务领域事件的场景
如果观察者是用来处理领域事件(比如聚合根状态变更后触发的领域内通知,例如订单支付成功后触发库存扣减的领域逻辑),接口应留在领域层,实现分两种情况:
- 纯领域内无依赖实现:若实现完全是领域逻辑的一部分,可留在领域层;
- 跨领域/外部依赖实现:这类需放到基础设施层,比如发送邮件、调用外部API。
但你提到当前实现无第三方依赖且非领域相关,显然不属于这类场景。
2. 服务应用层编排的场景
如果观察者是用来协调应用层流程(比如某个应用服务执行完后,触发多个其他应用服务动作,或记录审计日志这类非领域核心逻辑),将接口和实现放到应用层完全符合业界惯例:
- 应用层的核心职责就是编排领域服务、协调跨领域/外部操作,观察者模式能有效解耦不同应用服务间的依赖;
- 无第三方依赖的实现放在应用层合理,因为它不涉及数据库、消息队列这类具体基础设施细节。
3. 通用工具类场景
如果观察者模式是完全通用、可被多复用的工具(比如不绑定任何业务逻辑的Observer/Subject通用接口),可以单独抽一个共享工具层(比如shared/utils或core层),放在领域层和应用层之外,供所有层调用,这也是不少团队的通用做法,避免重复实现。
总结建议
结合你的描述(无第三方依赖、非领域相关),优先按以下方式处理:
- 若仅为应用层服务:直接移到应用层;
- 若属于通用工具:抽成独立的共享工具层。
内容的提问来源于stack exchange,提问作者Roger González Hermosa
相关产品推荐
相关产品推荐

