用途
该技能用于在 Angular 应用中落地领域驱动设计(DDD)与整洁架构分层。当需要设计领域模型(聚合、实体、值对象)、实现领域事件、定义仓储接口与领域服务、建立限界上下文与统一语言、强制层间依赖方向、应用战术 DDD 模式(规格、工厂、领域事件)或战略 DDD 模式(上下文映射、防腐层),以及从贫血领域模型迁移到充血领域模型时,可启用本技能。
主要能力
分层架构
采用四层架构:Presentation → Application → Domain ← Infrastructure。
- Domain 层必须是纯 TypeScript,不依赖任何框架。
- 所有依赖指向内层,即指向 Domain 层。
- 禁止 Domain 层依赖 Application、Infrastructure 或 Presentation。
依赖方向规则:
- Presentation 可依赖 Application 与 Shared 层。
- Application 可依赖 Domain 与 Shared 层。
- Infrastructure 只能依赖 Domain 层接口。
- Domain 不得依赖任何其他层。
领域层——实体
- 对具有标识与生命周期的对象使用实体。
- 将业务逻辑封装在实体方法中。
- 使用私有字段加 getter,不使用公开 setter。
- 实现工厂方法(如 static create())创建实体。
- 状态变化时抛出领域事件。
- 不通过公开 setter 暴露内部状态。
领域层——值对象
- 对无标识的概念使用值对象。
- 值对象必须不可变(readonly 字段、私有构造函数)。
- 在静态工厂方法(如 static create())中实现校验。
- 实现 equals() 方法进行基于值的相等比较。
- 不创建未经校验的值对象。
领域层——聚合
- 使用聚合作为相关实体的一致性边界。
- 在聚合内所有实体上强制业务不变量。
- 只能通过聚合根访问实体。
- 不允许直接访问聚合内的实体。
领域层——领域事件
- 对业务上重要的事件抛出领域事件。
- 将事件存储在实体的内部 _domainEvents 数组中。
- 所有事件包含 eventId、occurredOn 与 eventType。
- 发布后通过 clearDomainEvents() 清除事件。
领域层——仓储接口
- 在 Domain 层定义仓储接口。
- 异步操作使用 Observable 返回类型。
- 方法签名使用领域实体与值对象。
- 不在 Domain 层实现仓储。
应用层
- 在应用服务中编排领域对象与基础设施。
- 用例操作使用命令/查询模式。
- 持久化实体后发布领域事件。
- 不将业务逻辑放在应用服务中(业务逻辑属于 Domain)。
基础设施层——仓储实现
- 在 Infrastructure 层实现领域仓储接口。
- 在领域实体与持久化模型之间转换。
- 使用 toDomain() 方法将持久化数据映射为领域实体。
- 使用 toFirestore()(或类似)方法将领域实体映射为持久化数据。
- 不向 Domain 或 Application 层暴露持久化细节。
测试
- 独立测试领域实体与值对象(单元测试)。
- 在领域层测试不变量与业务规则。
- 测试应用服务时 mock 仓储接口。
- 测试领域事件的生成与清除。
使用方式
该技能以规则说明与代码示例的形式提供。核心内容包括:
- 分层架构图与依赖规则(依赖指向内层,绝不向外)。
- 实体示例:Workspace 实体,包含私有字段、工厂方法 static create()、getter、业务方法 rename()、不变量校验 validateOwnership()、领域事件添加与清除。
- 值对象示例:WorkspaceName 与 WorkspaceId,包含私有构造函数、静态工厂方法、校验规则、equals() 比较。
- 聚合示例:WorkspaceAggregate,作为一致性边界,通过聚合根强制不变量(仅管理员或所有者可添加/移除成员、不可重复添加、成员上限、不可移除所有者)。
- 领域事件示例:DomainEvent 接口与 BaseDomainEvent 抽象类,包含 eventId、occurredOn、eventType;WorkspaceCreatedEvent 等具体事件。
- 仓储接口示例:IWorkspaceRepository,使用 Observable 返回类型,方法包括 findById、findByOwnerId、save、delete。
- 领域服务示例:IWorkspaceGuardService,包含 canUserAccessWorkspace、getUserPermissions。
- 应用服务示例:WorkspaceService,使用 inject 注入仓储与事件发布器,编排创建与重命名工作区,持久化后发布并清除领域事件。
- 命令模式示例:CreateWorkspaceCommand 与 CreateWorkspaceHandler。
适用场景
- 设计包含聚合与实体的领域模型。
- 实现值对象与领域事件。
- 定义仓储接口与领域服务。
- 建立限界上下文与统一语言。
- 强制层间依赖(Domain ← Application ← Infrastructure ← Presentation)。
- 应用战术 DDD 模式(规格、工厂、领域事件)。
- 实现战略 DDD 模式(上下文映射、防腐层)。
- 从贫血领域模型迁移到充血领域模型。
限制
资料未提供该技能的安装命令、收费方式、价格、支持平台或具体运行环境要求,暂未提供。资料中的示例基于 Angular 与 Firebase/Firestore 场景,但未说明对其他框架或持久化方案的适配情况。