State Machines and Status Enums Documentation
Overview
EasyAF provides a sophisticated state machine and status management system through database-driven enumerations. This approach allows dynamic workflow configuration without code changes while maintaining type safety and data integrity.Core Concepts
Database-Driven Enumerations
Traditional enums are compile-time constants. EasyAF’s database-driven approach provides:- Runtime Configurability: Add/modify states without recompiling
- Historical Integrity: Old records maintain valid references
- Rich Metadata: States include display text, instructions, and transitions
- Active/Inactive States: Disable states without breaking existing data
Status vs State
- Status: Simple categorization (e.g., Active, Inactive, Pending)
- State: Complex workflow positions with transitions (e.g., Created → Processing → Completed)
Interface Hierarchy
Base Interfaces
IDbEnum
Foundation for all database enumerations:IActiveTrackable
Controls availability:IHumanReadable
User-facing text:ISortable
Defines order and progression:Status Interfaces
IDbStatusEnum
Simple status enumeration:IHasStatus<T>
Entities with status:
State Machine Interfaces
IDbStateEnum
Rich state with transitions:IHasState<T>
Entities in state machine:
Implementation Examples
Status Entity
Simple status tracking for invoices:State Machine Entity
Complex workflow with transitions:Manager Integration
StatusEntityManager Usage
StateMachineEntityManager Usage
Standard State Machine Conventions
Sort Order Standards
StateMachineEntityManager provides standard methods with conventional sort orders:- 0: Created/Initial (SetCreatedAsync)
- 1-97: Custom intermediate states
- 98: Cancelled - Terminal state (SetCancelledAsync)
- 99: Failed - Terminal state with error (SetFailedAsync)
- 100: Completed - Success terminal state (SetCompletedAsync)
Terminal States
States with sort orders 98-100 are considered terminal:- No outgoing transitions
- Workflow ends
- May allow reset to initial state
Advanced Patterns
Dynamic State Validation
State History Tracking
Conditional Transitions
Parallel States
UI Integration
Display Current State
State Visualization
Best Practices
- Use SortOrder consistently: Maintain gaps (0, 10, 20) for future states
- Keep transitions simple: Avoid complex branching when possible
- Document state meanings: Clear DisplayName and InstructionText
- Validate transitions: Check business rules before state changes
- Track history: Log all state transitions for audit
- Handle concurrency: Use optimistic locking for state updates
- Cache state types: Initialize() once, reuse cached values
- Test edge cases: Terminal states, backwards transitions
- Provide clear UI: Show available actions based on current state
- Plan for inactive states: Design migration path for deprecated states