Skip to main content

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

  1. Use SortOrder consistently: Maintain gaps (0, 10, 20) for future states
  2. Keep transitions simple: Avoid complex branching when possible
  3. Document state meanings: Clear DisplayName and InstructionText
  4. Validate transitions: Check business rules before state changes
  5. Track history: Log all state transitions for audit
  6. Handle concurrency: Use optimistic locking for state updates
  7. Cache state types: Initialize() once, reuse cached values
  8. Test edge cases: Terminal states, backwards transitions
  9. Provide clear UI: Show available actions based on current state
  10. Plan for inactive states: Design migration path for deprecated states