Decision Matrix
This matrix helps choose between Bus Mode (CQRS) and Direct Mode (Use Case) based on operation complexity.
Quick Decision Tree
Does the operation need domain events?
├─ YES → Bus Mode
└─ NO
└─ Does it involve multiple entities or complex business rules?
├─ YES → Bus Mode
└─ NO → Direct Mode
Comparison Table
| Criterion | Direct Mode | Bus Mode |
|---|---|---|
| Simple CRUD | ✅ Recommended | ❌ Over-engineered |
| Complex business logic | ⚠️ Possible | ✅ Recommended |
| Domain events needed | ❌ Manual | ✅ Automatic |
| Multi-entity transactions | ⚠️ Manual | ✅ Built-in |
| Middleware support | ❌ No | ✅ Yes |
| Async processing | ❌ Hard to add | ✅ Easy to add |
| Development speed | ✅ Faster | ⚠️ More boilerplate |
When to Use Direct Mode
- Simple read operations (homepage, about page)
- List/detail views without business logic
- Public read-only API endpoints
- Rapid prototyping
When to Use Bus Mode
- Operations requiring domain events
- Complex business rules
- Multi-entity transactions
- Operations needing middleware (logging, authorization)
- Write operations with side effects
Examples from Demo Application
Direct Mode: Homepage module displays a simple welcome message.
Bus Mode: Library module handles book CRUD with events and permissions. Loan module manages complex borrowing/return workflows. User module handles authentication with security events.
Best Practices
- Start Simple: Begin with Direct Mode for unclear requirements, migrate when complexity emerges
- Module Consistency: Avoid mixing modes within a single module
- Choose Based on Needs: If events, transactions, or middleware are known upfront, start with Bus Mode
See Also
- CQRS - Conceptual foundation for Bus Mode