用途
Capabilities Layer 提供了一组在 src/app/capabilities 下实现功能的架构模式,目标是把每个能力作为独立的限界上下文(bounded context)交付,使能力之间只通过事件和工作区上下文进行交互,从而降低耦合、保持各能力的凝聚力。
主要能力与结构规则
- 每个能力应保持内聚:包含 UI、应用编排,以及(在需要时)领域模型。
- 禁止为业务逻辑创建跨能力的导入;能力之间通过事件通信。
状态管理
- 使用
@ngrx/signals存储作为能力状态的唯一来源。 - 通过 computed signals 派生视图状态;避免可变数组/对象,避免使用
.push()。 - 异步副作用通过
rxMethod+tapResponse运行,并显式选择操作符。
事件驱动交互
- 在持久化之后发布领域/应用事件(append-before-publish,先追加后发布)。
- 在应用存储/副作用中订阅事件,而不是在表现层组件中订阅。
UI 规则
- 使用独立(standalone)、无 zone(zone-less)的组件。
- 模板仅绑定 signals,并使用 Angular 控制流语法(
@if、@for、@switch、@defer)。 - 仅使用 Material Design 3 token;不得硬编码颜色。
数据边界
- 基础设施返回 Observable/Promise;在模板使用前转换为 signals。
- 不得将 Firebase/DataConnect DTO 泄漏到集成/基础设施之外。
测试期望
- 对存储状态转换编写单元测试,覆盖关键流程。
- 使用 Playwright 覆盖 happy path(正常路径)。
- 使用稳定的选择器(
data-testid、roles/labels)。
适用场景
适用于采用 Angular 与 @ngrx/signals 的前端项目,尤其是需要将功能按能力边界拆分、以事件驱动方式解耦、并统一状态与 UI 规范的代码库。
限制
资料未提供该模式的安装命令、版本要求、收费信息或具体代码示例;上述规则为架构约定,实际落地方式暂未提供。