用途
dotnet-domain-modeling 用于在 C# 中实践领域驱动设计(DDD)的战术模式,专注于领域层本身——即封装业务规则的纯 C# 模型,独立于任何持久化技术。它帮助开发者构建聚合根、实体、值对象、领域事件、集成事件、领域服务与仓储契约,并区分富领域模型与贫血领域模型。
主要能力
聚合根与实体
聚合是被视为单一数据变更单元的领域对象集群,聚合根是入口点,所有修改都通过它进行。技能提供实体基类(Entity<TId>)以标准化标识与相等性,以及聚合根基类(AggregateRoot<TId>)用于收集领域事件。示例展示了 Order 聚合的创建、添加行、提交等操作,并列出聚合设计规则:所有变更通过聚合根、仅通过 ID 引用其他聚合、保持聚合小巧、每个事务一个聚合、集合以 IReadOnlyList<T> 暴露。
值对象
值对象没有标识,由属性值定义,相同属性即相等。C# 的 record 和 record struct 提供天然值语义。技能给出 CustomerId、Address、Money 等示例,说明如何用值对象封装约束与行为(如货币一致性校验),并给出 EF Core 映射方式(owned type 或 value conversion)。同时提供何时使用值对象与原始类型的对照。
领域事件
领域事件表示领域中发生的有意义的事情,用于聚合间解耦并触发副作用。技能定义 IDomainEvent 标记接口、DomainEventBase 基记录、具体事件(OrderCreated、OrderSubmitted、OrderCancelled),并展示 DomainEventDispatcher 在 SaveChangesAsync 成功后分发事件,以及通过 SaveChangesInterceptor 保存并分发事件的实现。还对比了领域事件与集成事件在范围、传输、耦合、可靠性上的差异,并给出领域事件处理器发布集成事件的示例。
富模型与贫血模型
技能通过 ShoppingCart 示例对比富领域模型(业务逻辑在实体内,方法强制不变量)与贫血领域模型(实体仅为数据容器,逻辑在外部服务中,属反模式),并提供决策指南,建议对具有复杂业务规则的聚合使用富模型,对简单 CRUD 实体可接受贫血模型。
使用方式
该技能以 C# 代码示例和设计规则的形式提供指导,涵盖实体基类、聚合根基类、值对象、领域事件契约与分发、仓储契约设计等。开发者可参照示例在自己的领域层中实现相应模式。
适用场景
适用于需要在 .NET 项目中实现 DDD 战术模式、构建富领域模型、封装业务规则、通过领域事件解耦聚合的场景。
限制
该技能不涵盖 EF Core 配置与聚合持久化映射、DbContext 生命周期与迁移、API 边界输入验证、数据访问策略选择、垂直切片架构与请求管道、消息基础设施与 saga 编排等主题,这些由其他技能处理。