131 lines
5.8 KiB
Markdown
131 lines
5.8 KiB
Markdown
# MP.IOC
|
|
|
|
MAPO IOC: WebApi rest per la gestione delle chiamate dagli applicativi remoti sul campo (IOB-PI su Raspberry Pi e IOB-WIN su PC Windows) che si occupano di comunicare con le varie macchine di processo i dati da trasmettere al MES.
|
|
|
|
È la nuova implementazione del modulo IO (il precedente era fatto in .NET Framework 4.7.2) su cui si sta dirigendo lo sviluppo della soluzione MES MAPO.
|
|
|
|
Integra raccolta di informazioni riguardo ai compiti svolti e questi sono ottimizzati per l'impiego di cache e ottimizzazioni varie su ogni strato del progetto.
|
|
|
|
**Build:** ✅ 0 errori, 12 warnings
|
|
|
|
## Sezioni Principali
|
|
|
|
- Api IOB (`api/IOB`) — endpoint principale per comunicazioni da campo (52 metodi)
|
|
- Benchmark Redis (`api/Bench`) — tool di test per debugging Redis
|
|
- Api Ricette (`api/Recipe`) — recupero ricette per PODL
|
|
- Dashboard Blazor — interfaccia web interattiva
|
|
|
|
## Architettura
|
|
|
|
### Livello Controller (MP.IOC/Controllers/)
|
|
|
|
| Controller | Routing | Methods | Descrizione |
|
|
|------------|---------|---------|-------------|
|
|
| `IOBController` | `api/IOB` | 52 | Endpoint principale per IOB-PI/IOB-WIN |
|
|
| `BenchController` | `api/Bench` | 10 | Test/benchmark Redis |
|
|
| `RecipeController` | `api/Recipe` | 2 | API ricette (JSON) |
|
|
| `RecipeArchiveController` | `api/RecipeArchive` | 2 | API archive ricette (file) |
|
|
|
|
### Livello Dati
|
|
|
|
| Componente | Tipologia | Descrizione |
|
|
|------------|-----------|-------------|
|
|
| `MpDataService` | Singleton | Service di accesso dati principale (~3516 righe) |
|
|
| `MpIocController` | Singleton | 82 metodi EFCore nel progetto MP.Data |
|
|
| `Redis` | 2 connessioni | `redisConn`, `redisConnAdmin` per dati IOB |
|
|
| `MongoDB` | Via `MpMongoController` | Storage ricette |
|
|
|
|
### Livello DbContext
|
|
|
|
| DbContext | ConnStr | Uso |
|
|
|-----------|---------|-----|
|
|
| `MoonProContext` | `MP.Data` | Tabelle anagrafiche, ODL, produzione, macchine |
|
|
| `MoonPro_UtilsContext` | `MP.Utils` | Tabelle utility (VMSFD, MicroStati) |
|
|
| `MoonPro_FluxContext` | `MP.Flux` | FluxLog, configurazioni flusso |
|
|
|
|
### Livello DI
|
|
|
|
Registrato via `AddIocDataLayer()` in `MP.Data/DataServiceCollectionExtensions.cs`:
|
|
|
|
```
|
|
Singleton: IMtcSetupRepository, IMtcSetupService, ProductionRepository, MpIocController, MpDataService, IFusionCacheSerializer, IConnectionMultiplexer, IFusionCache
|
|
Scoped: IIocRepository, IStatsAggrRepository, IStatsDetailRepository, IIocService, IStatsAggrService, IStatsDetailService
|
|
```
|
|
|
|
### Livello Infrastruttura
|
|
|
|
- **FusionCache** — ✅ **L1 Memory + L2 Redis Distributed + Redis Backplane** (migrazione giugno 2026)
|
|
- **MessagePipe** — Broadcasting real-time tra servizi
|
|
- **OpenTelemetry** — Tracing configurabile (non abilitato in MP.IOC)
|
|
- **Swagger** — Documentazione API in sviluppo
|
|
|
|
## Refactoring Completati
|
|
|
|
### ✅ Fase 1: Anti-Pattern Controllers
|
|
|
|
Rimossi `static IConfiguration _configuration` da tutti i 4 controller (`IOBController`, `BenchController`, `RecipeController`, `RecipeArchiveController`) e rimossa la dead code assignment dai costruttori.
|
|
|
|
### ✅ Fase 2: FusionCache + Redis Backplane
|
|
|
|
**Pacchetti aggiunti** (`MP.IOC.csproj`):
|
|
- `Microsoft.Extensions.Caching.StackExchangeRedis`
|
|
- `ZiggyCreatures.FusionCache`
|
|
- `ZiggyCreatures.FusionCache.Backplane.StackExchangeRedis`
|
|
- `ZiggyCreatures.FusionCache.Serialization.NewtonsoftJson`
|
|
|
|
**Configurazione** (`Program.cs`):
|
|
- FusionCache attivo con **L1 Memory** + **L2 Redis Distributed** + **Redis Backplane**
|
|
- Serializer: `FusionCacheNewtonsoftJsonSerializer`
|
|
- Default Duration: 1 minuto con jitter max 5 secondi
|
|
|
|
**Helper aggiunto** (`MpDataService.cs`):
|
|
- `GetOrFetchAsync<T>()` — wrapper FusionCache con ActivitySource tracking e source tagging (MEMORY/REDIS/DB)
|
|
|
|
**18 metodi migrati** dal pattern manuale Redis (`redisDb.StringGetAsync`/`StringSetAsync`) → FusionCache:
|
|
|
|
| # | Metodo | Fetch From |
|
|
|---|--------|------------|
|
|
| 1 | `AnagStatiGetAllAsync` | `IocDbController` |
|
|
| 2 | `ArticoliGetLastByMaccAsync` | `IocDbController` |
|
|
| 3 | `ConfigGetAllAsync` | `IocDbController` |
|
|
| 4 | `DecNumArtGetFiltAsync` | `IocDbController` |
|
|
| 5 | `DossierLastByMachAsync` | `IocDbController` |
|
|
| 6 | `GetLastOdlAsync` | `IocDbController` |
|
|
| 7 | `ListValuesFilt` | `IocDbController` |
|
|
| 8 | `Macchine2SlaveGetAllAsync` | `IocDbController` |
|
|
| 9 | `MacchineGetFilt` | `_productionRepository` |
|
|
| 10 | `MacchineRecipeArchive` | `_productionRepository` |
|
|
| 11 | `MseGetAllAsync` | `IocDbController` (+ forceDb support) |
|
|
| 12 | `OdlCurrByMaccAsync` | `IocDbController` |
|
|
| 13 | `POdlGetByKey` | `_productionRepository` |
|
|
| 14 | `POdlGetByMaccArtAsync` | `IocDbController` |
|
|
| 15 | `ConfFluxMach` | `IocDbController` |
|
|
| 16 | `FluxLogFirstByMachAsync` | `IocDbController` |
|
|
| 17 | `FluxLogGetLastByMachAsync` | `IocDbController` |
|
|
|
|
### ✅ Build Verification
|
|
|
|
| Soluzione | Errori | Warnings | Stato |
|
|
|-----------|--------|----------|-------|
|
|
| MP-IOC | 0 | 12 | ✅ |
|
|
| MP-SPEC | 0 | vari | ✅ |
|
|
| MP-LAND | 0 | 3 | ✅ |
|
|
| MP-MON | 0 | vari | ✅ |
|
|
|
|
## Refactoring in Corso (Riferimento)
|
|
|
|
### Piano Generale (Vedi refactor_plan.md)
|
|
|
|
1. ~~**Fase 1 — Anti-Pattern**~~ — ✅ **Completata**
|
|
2. ~~**Fase 2 — FusionCache**~~ — ✅ **Completata** (18 metodi migrati)
|
|
3. **Fase 3 — Repository IoC** — Scomporre `MpIocController` (1480 righe, 82 metodi) in 7-10 repository specialistici
|
|
4. **Fase 4 — Scomposizione MpDataService** — Il monolite da 3516 righe suddiviso in servizi tematici
|
|
5. **Fase 5 — Build & Verifica** — Validazione finale
|
|
|
|
**Stato attuale:** Fasi 1-2 completate. Build stabile 0 errori.
|
|
|
|
## Prossimi Passi
|
|
|
|
- **Fase 3**: Creare repository specialistici per `MpIocController` (Vedi refactor_plan.md per il inventario completo)
|
|
- **Metodi atipici**: Verificare manualmente 4 metodi con pattern non-standards (`GetCurrOdlAsync`, `StatoProdMacchinaAsync` (private), `verificaIdxMacchinaAsync`, `ListMasterAsync`/`ListSlaveAsync`)
|