Architecture — Technology Stack¶
Everything below is read from the five .csproj files and Startup.cs. All five projects target
net6.0.
Platform¶
| Component | Version | Notes |
|---|---|---|
| .NET | 6.0 | < in all five projects |
| ASP.NET Core MVC | 6.0 | Classic Program. + Startup. hosting model, not minimal APIs |
| Entity Framework Core | 6.0.15 | SQL Server provider. Lazy loading is not enabled — see the note below |
| Database | SQL Server | Two application databases plus a Hangfire store |
| Identity | ASP.NET Core Identity 6.0.15 | Application, EF stores, custom Application |
| View engine | Razor with runtime compilation | Add — views can be edited without a rebuild |
Packages by purpose¶
Data & identity¶
| Package | Version |
|---|---|
Microsoft. · . · . · . · . · . |
6.0.15 |
Microsoft. · Microsoft. |
6.0.15 |
Microsoft. |
6.0.15 |
BCrypt. |
4.0.2 |
Identity |
5.1.0 |
Passwords are hashed with BCrypt through a custom BCryptPasswordHasher rather than the Identity
default. Note that it is not wired through DI: ApplicationUserManager's constructor assigns
PasswordHasher = new BCryptPasswordHasher() directly, and the two services.AddTransient<BCryptPasswordHasher>()
registrations in Startup.cs (the same line twice) are never resolved.
Lazy loading is referenced but never switched on
Microsoft.EntityFrameworkCore.Proxies is referenced, and the entity classes declare their
navigation properties virtual as the proxy provider requires — but UseLazyLoadingProxies()
is never called. Neither AddDbContext registration in Startup.cs enables it, and
NKO_DBEntities1.OnConfiguring only calls ConfigureWarnings(...). Lazy loading is therefore
off: an un-Included navigation property is null, not a database round-trip. Treat the
package as part of R1-4 (referenced but unused), and assume every query must .Include(...)
what it needs.
Background work — three schedulers¶
| Package | Version | Used for |
|---|---|---|
Quartz. |
3.6.2 | Update (daily 03:00) and Export, wired in Program. |
Hangfire. · Hangfire. |
1.7.24 | Fire-and-forget warehouse exports (Background) |
Hangfire. |
1.8.6 | Job store — note the version gap against Hangfire 1.7.24 |
Cronos |
0.7.1 | Cron parsing for the hand-rolled IHosted scheduler |
Having three independent scheduling mechanisms in one application is unusual — see External Services.
Documents & reporting¶
| Package | Version | Used for |
|---|---|---|
EPPlus |
6.1.3 | Excel export — used in 9 files |
Document |
2.19.0 | Word/Office document generation |
Rotativa. |
1.2.0 | PDF rendering via wkhtmltopdf — used in 22 files |
QRCoder |
1.4.1 | QR codes on printed documents |
System. |
6.0.0 | Image handling — Windows-only from .NET 6 onward |
AWS¶
| Package | Version | Used for |
|---|---|---|
AWSSDK. |
3.7.103.21 | Document storage behind IS3 |
AWSSDK. · AWSSDK. |
3.7.x | SDK plumbing |
AWSSDK. |
3.7.101.20 | Registered in DI but never injected anywhere |
Web & UI¶
| Package | Version | Used for |
|---|---|---|
Microsoft. |
6.0.15 | JSON with reference-loop handling |
Microsoft. |
6.0.14 | Runtime view compilation |
X. · X. |
8.4.6 / 8.4.5 | The int? page paging on every grid |
Build |
3.2.449 | Static asset bundling |
Microsoft. |
5.0.8 | Serving views embedded in NKO. |
SignalR ships in the framework and is added with services.AddSignalR(); the hub is mapped at
/hub.
Referenced but not used¶
Five dependencies are declared and never exercised. They still restore, compile in and enlarge the deployment.
| Package | Evidence |
|---|---|
Microsoft. 6.0.15 |
Use appears nowhere in the solution, so the proxy provider is never activated despite the virtual navigation properties. |
Refit 6.3.2 · Refit. 6.0.94 |
Zero Refit interfaces in the solution — no [Get("…")] / [Post("…")] attribute anywhere. Referenced by both NKO. and NKO.; the only trace is a using Refit; in Startup.. Refit is not wired to anything. |
Twilio 5.59.0 |
One stray using Twilio. in Providers. No SMS is ever sent. |
Mail 4.0.0 · Mime 4.0.0 |
Only using statements at the top of Email; the code below uses System.. |
AWSSDK. |
IAmazon appears once — its own registration in Startup.. Nothing resolves it, yet it builds an authenticated SNS client at startup. |
Tracked as R1-4 in Recommendations.
Version consistency¶
ASP.NET Core 2.2 packages inside a .NET 6 application
Five Microsoft.AspNetCore.* packages are pinned at 2.2.x alongside the 6.0.15 ones —
Mvc.Core 2.2.5, Http.Abstractions 2.2.0, Identity 2.2.0, Mvc.ViewFeatures 2.2.0 and
Mvc.Razor.ViewCompilation 2.2.0. On net6.0 these types come from the shared framework, so
referencing the old standalone packages risks duplicate-type and assembly-load conflicts. This
is R7-13 in Recommendations.
Smaller drifts in the same family: Mvc.Razor.RuntimeCompilation is 6.0.14 while everything else
Microsoft is 6.0.15, and Hangfire.SqlServer 1.8.6 runs against Hangfire.Core 1.7.24.
Build & tooling¶
- Solution:
NKO.Main/ERP-System.sln - Startup project:
NKO.Main/NKO.Main - EF tooling:
Microsoft.EntityFrameworkCore.Tools+ a local.config/dotnet-tools.json; migrations must be applied per context (-Context NKO_DBEntities1/-Context WarehouseDBContext) - Configuration:
appsettings.json— not committed.appsettings.example.jsonshows the shape: three connection strings,StorageConfigs(region / clientId / clientSecret),SysUrl, logging levels andScheduledJobsSettings.