用途
本文档为一个项目定义领域驱动设计(DDD)架构与严格的分层边界,作为团队在代码组织、依赖方向和模式使用上的规范依据。
分层架构(核心法则)
依赖必须向内流动:表现层(Presentation)→ 应用层(Application)→ 领域层(Domain)← 基础设施层(Infrastructure)。
- 领域层(src/app/domain/):保持纯净,零框架依赖(无 Angular、无 Firebase、无 RxJS)。包含实体(最小化、无意图的模型)、值对象(不可变、创建时校验)、仓储(仅接口/端口)、聚合(事务边界)、领域事件(已发生的不可变“事实”)。
- 应用层(src/app/application/):负责编排,实现用例(Handlers);状态以 NgRx Signals(Store)为事实来源;包含映射器(Domain ↔ DTO / ViewModel 转换);定义仓储与服务接口(端口)。
- 基础设施层(src/app/infrastructure/):作为适配器实现应用层/领域层定义的接口;承载 Firebase、HTTP、持久化、日志、外部 SDK 等技术细节;DTO 仅限于本层,绝不泄漏到表现层或领域层。
- 表现层(src/app/presentation/):仅做 UI,不含业务逻辑;消费来自 store 的 signals;所有组件为 standalone 且 zone-less。
战术 DDD 模式
- 仓储模式:接口定义在领域层或应用层,实现隐藏在基础设施层,通过 InjectionToken 注入以保证松耦合。
- 领域服务:当逻辑涉及多个实体或难以自然归入单个实体时使用,必须保持纯净(无 I/O)。
- 事件驱动流程:Append(将命令结果持久化到 store/数据库)、Publish(通过 EventBus 发出事件)、React(其他 store 或能力监听并响应)。
项目结构与命名
文档给出分层与类型的命名模式:领域层实体为 {name}.entity.ts,应用层 store 为 {name}.store.ts,基础设施层仓储为 {name}-firestore.repository.ts,表现层组件为 {name}.component.ts。使用别名导入(@domain/、@application/、@infrastructure/*),禁止使用 ../../ 跨层相对导入。
奥卡姆剃刀原则
- 极简:无必要时不添加层或抽象。
- 内聚:保持相关逻辑靠近。
- 解耦:最小化模块间依赖。
- 裁定:涉及跨层导入或领域层非法字段访问的 TypeScript 错误(TS2339、TS2345)属于架构违规——应修正设计,而不是抑制错误。
适用场景与限制
该规范适用于遵循上述分层、采用 Angular 与 NgRx Signals、并以 Firebase 作为技术实现的 TypeScript 项目。关于具体收费、价格、平台支持范围、实际效果或其他使用步骤,资料暂未提供。