m09-domain
CRITICAL: Use for domain modeling. Triggers: domain model, DDD, domain-driven design, entity, value object, aggregate, repository pattern, business rules, validation, invariant, 领域模型, 领域驱动设计, 业务规则
By actionbook · 2,766 installs
npx skills add actionbook/rust-skills --skill m09-domain
Source repository · Upstream listing
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 Concept Rust Pattern Ownership Implication
Entity struct + Id Owned, unique identity
Value Object struct + Clone/Copy Shareable, immutable
Aggregate Root struct owns children Clear ownership tree
Repository trait Abstracts persistence
Domain Event enum Captures state changes
Service impl block / free fn Stateless 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):
Design Question Trace To Ask
Entity vs Value Object domain What makes two instances "the same"?
Aggregate boundaries domain What must be consistent together?
Validation rules domain What business rules apply?
Trace Down ↓
To implementation (Layer 1):
Quick Reference
DDD Concept Rust Pattern Example
Value Object Newtype struct Email(String);
Entity Struct + ID struct User { id: UserId, ... }
Aggregate Module boundary mod order { ... }
Repository Trait trait UserRepo { fn find(...) }
Domain Event Enum enum OrderEvent { Created, ... }
Pattern Templates
Value Object
Entity
Aggregate
Common Mistakes
Mistake Why Wrong Better
Primitive obsession No type safety Newtype wrappers
Public fields with invariants Invariants violated Private + accessor
Leaked aggregate internals Broken encapsulation Methods on root
String for semantic types No validation Validated newtype
Related Skills
When See
Type driven implementation m05 type driven
Ownership for aggregates m01 ownership
Domain error handling m13 domain error
Specific domain rules domain