Relocates ModuleOrchestrator, ServiceCollectionExtensions, and ApiPrefixConvention from SlpModularCms.Api into SlpModularCms.Core.Hosting so a new Master-less SlpModularCms.Api.Slave host project (ports 5285/7222) can share the same bootstrap code without duplicating it. This lets a developer run a master instance and a slave instance side by side locally to test the master/slave connection, without touching the existing master/slave protocol itself. Relocates the two orchestrator/convention test files from Modules.Identity.Tests to Core.Tests, dropping an incidental ProjectReference to SlpModularCms.Api that existed only for those tests. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.0 KiB
3.0 KiB
Component Dependencies — Local Dev Master/Slave Setup
Dependency Matrix
| Component | Depends On | Depended On By |
|---|---|---|
SlpModularCms.Core (incl. new Core.Hosting) |
— | SlpModularCms.Api, SlpModularCms.Api.Slave, Modules.Master, Modules.Availability, Modules.Identity |
SlpModularCms.Modules.Master |
Core |
SlpModularCms.Api only |
SlpModularCms.Modules.Availability |
Core |
SlpModularCms.Api, SlpModularCms.Api.Slave |
SlpModularCms.Modules.Identity |
Core |
SlpModularCms.Api, SlpModularCms.Api.Slave |
SlpModularCms.Api (master host) |
Core, Modules.Master, Modules.Availability, Modules.Identity |
— (top-level executable) |
SlpModularCms.Api.Slave (new, slave host) |
Core, Modules.Availability, Modules.Identity |
— (top-level executable) |
frontend |
Backend HTTP API (either instance, via VITE_API_BASE_URL) |
— |
Communication Patterns
- Build-time: Standard MSBuild
ProjectReference— no new communication mechanism. The exclusion ofModules.MasterfromSlpModularCms.Api.Slaveis achieved purely by omitting thatProjectReference, which in turn keepsModules.Master.dllout of the slave's build output, which in turn meansModuleOrchestrator.DiscoverModules(running inside the slave process) never finds it. - Runtime — Master ↔ Slave: Unchanged existing HTTP-based protocol between
Modules.Master'sSlaveApiClient(master side) andModules.Availability'sMasterController(slave side), authenticated via a per-instance API key. This feature does not touch that protocol — it only makes it possible to point one local instance at another. - Runtime — Frontend ↔ Backend: Standard HTTPS/CORS,
VITE_API_BASE_URLselects which backend instance the frontend dev server talks to;Cors:AllowedOriginsin the target instance'sappsettingsmust include the calling frontend's origin.
Data Flow (Local Setup)
graph LR
FE["frontend (Vite dev server)"]
ApiM["SlpModularCms.Api<br/>:5284 / :7221"]
ApiS["SlpModularCms.Api.Slave<br/>:5285 / :7222"]
DBM["Local DB: SlpModularCmsLocal_Master"]
DBS["Local DB: SlpModularCmsLocal_Slave"]
FE -- "VITE_API_BASE_URL (master mode)" --> ApiM
FE -- "VITE_API_BASE_URL (slave mode)" --> ApiS
ApiM -- "master/slave protocol (API key)" --> ApiS
ApiM --> DBM
ApiS --> DBS
classDef fe fill:#f6e05e,stroke:#c05621,stroke-width:1px,color:#000;
classDef api fill:#63b3ed,stroke:#2b6cb0,stroke-width:1px,color:#000;
classDef db fill:#9ae6b4,stroke:#2f855a,stroke-width:1px,color:#000;
class FE fe;
class ApiM,ApiS api;
class DBM,DBS db;
Text alternative: The frontend dev server can point at either the master (5284/7221) or slave (5285/7222) backend depending on which env mode is active. The master backend talks to the slave over the existing master/slave protocol. Each backend uses its own local database, keeping master and slave data isolated.