SuperAPI AI 工具集

ddd-architecture

编程与开发

查看项目

更新于 10-15 10:21

技能介绍

用途

该技能用于在 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 场景,但未说明对其他框架或持久化方案的适配情况。