XAF (eXpressApp Framework) — Skill Index
DevExpress XAF is a cross-platform .NET application framework for building business applications (Blazor Server and WinForms). It provides MVVM architecture, ORM integration (EF Core and XPO), security, validation, and rich module ecosystem.
Versions covered: v24.2 and v25.1
Platforms: Blazor Server, WinForms, Web API (OData)
Official docs: https://docs.devexpress.com/eXpressAppFramework/112670/expressapp-framework
DevExpress MCP: https://api.devexpress.com/mcp/docs
Sub-Skills — When to Use Each
Data Modeling
| Skill |
Load When |
xaf-xpo-models |
Defining XPO persistent objects (XPObject, BaseObject, associations, PersistentAlias) |
xaf-ef-models |
Defining EF Core entities (BaseObject EF, virtual properties, DbContext, migrations) |
xaf-nonpersistent |
Creating NonPersistent objects for custom data sources, API wrappers, input dialogs |
UI Construction
| Skill |
Load When |
xaf-controllers |
Creating controllers, SimpleAction/PopupWindowShowAction/SingleChoiceAction/ParametrizedAction |
xaf-editors |
Working with built-in property editors, list editors, GridListEditor customization |
xaf-custom-editors |
Building custom property editors (Blazor/WinForms) or custom list editors |
xaf-conditional-appearance |
Conditionally hiding/disabling/coloring UI elements via [Appearance] attribute |
Platform-Specific
| Skill |
Load When |
xaf-blazor-ui |
Blazor-specific UI, thread safety (InvokeAsync), Razor components in XAF, JS interop |
xaf-winforms-ui |
WinForms-specific UI, XtraGrid access, background workers, layout, splash |
Security & Multi-Tenancy
| Skill |
Load When |
xaf-security |
Roles, permissions, authentication (Standard/AD/OAuth2), programmatic permission checks |
xaf-multi-tenant |
Multi-tenant SaaS apps with separate DB per tenant (v24.2+) |
Services & API
| Skill |
Load When |
xaf-web-api |
Building/consuming XAF OData Web API (JWT, custom endpoints, $filter/$expand) |
xaf-validation |
Validation rules (RuleRequiredField, RuleCriteria, custom rules, programmatic validation) |
Modules & Features
| Skill |
Load When |
xaf-reports |
XtraReports integration (setup, predefined reports, export, designer, parameters) |
xaf-dashboards |
Dashboard analytics (setup, data sources, designer, permissions) |
xaf-office |
File attachments, Spreadsheet editor, RichText editor, PDF viewer |
Deployment
| Skill |
Load When |
xaf-deployment |
IIS/Azure/Docker for Blazor, ClickOnce/MSI for WinForms, migrations, license, logging |
Diagnostics & Quality
| Skill |
Load When |
xaf-memory-leaks |
Diagnosing memory leaks, auditing event handler cleanup, reviewing ObjectSpace/CollectionSource lifetime |
Quick Architecture Reference
MySolution/
├── MySolution.Module/ ← platform-agnostic (business objects, controllers, modules)
│ ├── BusinessObjects/
│ ├── Controllers/
│ └── MySolutionModule.cs
├── MySolution.Blazor.Server/ ← Blazor-specific (Program.cs, BlazorApplication.cs)
│ └── DatabaseUpdate/Updater.cs
├── MySolution.Win/ ← WinForms-specific (Program.cs, WinApplication.cs)
└── MySolution.WebApi/ ← Web API service (Program.cs, OData endpoints)
Key Concepts
- ObjectSpace (
IObjectSpace) — unit of work; wraps EF Core DbContext or XPO Session. Not thread-safe. Never store in singleton services.
- XafApplication — application lifecycle, module registration, ObjectSpace creation.
- ModuleBase — platform-agnostic module; registers business objects, controllers, navigation items.
- Application Model — XML/in-memory model describing Views, Actions, Navigation — customizable without recompilation.
- DatabaseUpdater — runs on startup to apply schema changes and seed data (
Updater.cs).
Common Pitfalls (Quick Reference)
| Pitfall |
Fix |
ObjectSpace in singleton service |
Use IObjectSpaceFactory + using var os = factory.CreateObjectSpace(...) |
async/await + ConfigureAwait(false) in Blazor |
Remove ConfigureAwait(false) — Blazor needs sync context |
| Non-virtual EF Core properties |
All EF Core entity properties must be virtual |
XPO property without SetPropertyValue |
Use backing field + SetPropertyValue for change tracking |
AddDbContext instead of AddDbContextFactory |
XAF requires IDbContextFactory<T> |
| NonPersistent provider registered first |
Register .AddNonPersistent() after persistent providers |
Useful Links