Architecture & Tech Stack
Okommerce is built on ASP.NET Core 9 using MVC with feature areas, on top of Entity Framework Core 9 over Microsoft SQL Server 2022.
What technology stack is Okommerce built on?
Okommerce is built on ASP.NET Core 9 using MVC with feature areas, on top of Entity Framework Core 9 over Microsoft SQL Server 2022.
What is the Clean Architecture layering (Domain, Application, Infrastructure, Web)?
The solution is split into four projects following Clean Architecture.
Why do dependencies point inward, and what does each project contain?
Dependencies point inward — Web → Infrastructure → Application → Domain — so that the core business model never depends on volatile outer concerns like the web framework or the database.
What are the 7 BaseEntity columns every table shares, and what does each do?
Every table inherits a common BaseEntity with seven columns.
How does soft-delete work (IsDeleted + global query filter)?
Records are never hard-deleted in normal operation; instead the IsDeleted flag on BaseEntity is set to true.
How is per-deployment configuration stored (PlatformSettings key/value)?
Configuration that varies per deployment lives in a single PlatformSettings key/value store, accessed through a settings service.
How does the permission system work (module.action strings)?
Permissions are expressed as module.action strings — for example Orders.ViewOrders or Vendors.ManageVendorMode — grouped into roughly twenty modules (AccessControl, Dashboard, Catalogue,…
How does area-based routing work (Admin / Demo / root)?
The Web project uses ASP.NET Core *areas* to separate the application's distinct surfaces.
What background-job framework is used and what jobs run on it?
Background and scheduled work runs on Hangfire, which persists jobs and exposes a monitoring dashboard at /hangfire.
How are images processed and resized?
Image handling uses ImageSharp.
How are spreadsheets read/written?
Spreadsheet handling uses ClosedXML for .xlsx, with a built-in quoted-field parser for .csv.
How is optimistic concurrency used to prevent overselling stock?
Per-branch stock rows carry a RowVersion (a concurrency token).
How are public IDs (Guid) used alongside numeric IDs?
Every entity has both a numeric Id and a GUID PublicId.
What is the overall project layout and approximate size (entities, controllers)?
The solution is four projects.