M09 Domain

作者 actionbook5c40d3ad7851无许可证1.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库6周前更新

CRITICAL: Use for domain modeling. Triggers: domain model, DDD, domain-driven design, entity, value object, aggregate, repository pattern, business rules, validation, invariant, 领域模型, 领域驱动设计, 业务规则

AI 生成的概览

使用实体、值对象和聚合等 DDD 概念指导 Rust 领域建模。

功能
该技能提供将领域概念转化为 Rust 模式的设计指导,把实体、值对象、聚合根、仓储、领域事件和服务映射到具体的 Rust 构造。它给出关于标识、不变式和所有权的思考提示,并提供值对象、实体和聚合的模式模板。它还列出常见建模错误,并指向类型驱动设计、所有权和领域错误处理等相关技能。
适用场景
在 Rust 中为业务领域建模,需要判断某个概念是实体还是值对象、聚合边界在哪里,或如何强制不变式时使用。也适合在审查领域模型是否存在基本类型偏执、内部泄漏或所有权不清时使用。
运行要求
无需脚本或特殊工具,仅为说明性参考。示例假定使用 Rust 并熟悉 DDD 术语。

Domain Modeling

Layer 2: Design Choices

Core Question

What is this concept's role in the domain?

Before modeling in code, understand:

  • Is it an Entity (identity matters) or Value Object (interchangeable)?
  • What invariants must be maintained?
  • Where are the aggregate boundaries?

Domain Concept → Rust Pattern

Domain ConceptRust PatternOwnership Implication
Entitystruct + IdOwned, unique identity
Value Objectstruct + Clone/CopyShareable, immutable
Aggregate Rootstruct owns childrenClear ownership tree
RepositorytraitAbstracts persistence
Domain EventenumCaptures state changes
Serviceimpl block / free fnStateless operations

Thinking Prompt

Before creating a domain type:

  1. What's the concept's identity?

    • Needs unique identity → Entity (Id field)
    • Interchangeable by value → Value Object (Clone/Copy)
  2. What invariants must hold?

    • Always valid → private fields + validated constructor
    • Transition rules → type state pattern
  3. Who owns this data?

    • Single owner (parent) → owned field
    • Shared reference → Arc/Rc
    • Weak reference → Weak

Trace Up ↑

To domain constraints (Layer 3):

"How should I model a Transaction?"    ↑ Ask: What domain rules govern transactions?    ↑ Check: domain-fintech (audit, precision requirements)    ↑ Check: Business stakeholders (what invariants?)
Design QuestionTrace ToAsk
Entity vs Value Objectdomain-*What makes two instances "the same"?
Aggregate boundariesdomain-*What must be consistent together?
Validation rulesdomain-*What business rules apply?

Trace Down ↓

To implementation (Layer 1):

"Model as Entity"    ↓ m01-ownership: Owned, unique    ↓ m05-type-driven: Newtype for Id
"Model as Value Object"    ↓ m01-ownership: Clone/Copy OK    ↓ m05-type-driven: Validate at construction
"Model as Aggregate"    ↓ m01-ownership: Parent owns children    ↓ m02-resource: Consider Rc for shared within aggregate

Quick Reference

DDD ConceptRust PatternExample
Value ObjectNewtypestruct Email(String);
EntityStruct + IDstruct User { id: UserId, ... }
AggregateModule boundarymod order { ... }
RepositoryTraittrait UserRepo { fn find(...) }
Domain EventEnumenum OrderEvent { Created, ... }

Pattern Templates

Value Object

rust
struct Email(String);
impl Email {    pub fn new(s: &str) -> Result<Self, ValidationError> {        validate_email(s)?;        Ok(Self(s.to_string()))    }}

Entity

rust
struct UserId(Uuid);
struct User {    id: UserId,    email: Email,    // ... other fields}
impl PartialEq for User {    fn eq(&self, other: &Self) -> bool {        self.id == other.id  // Identity equality    }}

Aggregate

rust
mod order {    pub struct Order {        id: OrderId,        items: Vec<OrderItem>,  // Owned children        // ...    }
    impl Order {        pub fn add_item(&mut self, item: OrderItem) {            // Enforce aggregate invariants        }    }}

Common Mistakes

MistakeWhy WrongBetter
Primitive obsessionNo type safetyNewtype wrappers
Public fields with invariantsInvariants violatedPrivate + accessor
Leaked aggregate internalsBroken encapsulationMethods on root
String for semantic typesNo validationValidated newtype

Related Skills

WhenSee
Type-driven implementationm05-type-driven
Ownership for aggregatesm01-ownership
Domain error handlingm13-domain-error
Specific domain rulesdomain-*

来源与署名

来源:actionbook/rust-skills位于skills/m09-domain提交5c40d3a

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架