# Refactoring Repository: Decomposizione MpSpecController - STATO COMPLETO ## Riepilogo | Progetto | Build | Errori | |---|---|---| | MP.Data | OK | 0 | | MP.SPEC | OK | 0 | | MP.Land | OK | 0 | | MP.MON | OK | 0 | | MP-TAB3 | OK | 0 | | MP.Stats | OK | 0 | | MP.INVE | OK | 0 | | MP.IOC | OK | 0 | | MP.RIOC | OK | 0 | | MP.Prog | OK | 0 | | IobConf | OK | 0 | **Tutte le 10 soluzioni della codebase compilano con successo.** ## Repository Creati (8 nuovi) | # | Repository | Interfaccia | Metodi | DbContext | |---|---|---|---|---| | 1 | **Anag** | `IAnagRepository` | 26 | `MoonProContext` | | 2 | **Production** | `IProductionRepository` | 32 | `MoonProContext` | | 3 | **Dossier** | `IDossierRepository` | 6 | `MoonPro_FluxContext` | | 4 | **FluxLog** | `IFluxLogRepository` | 3 | `MoonPro_FluxContext` | | 5 | **System** | `ISystemRepository` | 7 | `MoonProContext` + `MoonProAdminContext` | | 6 | **MpVoc** | `IMpVocRepository` | 3 | `MoonPro_VocContext` | | 7 | **MpMon** | `IMpMonRepository` | 4 | `MoonProContext` | | 8 | **MpLand** | `IMpLandRepository` | 6 | `MoonProContext` | ## Sostituzioni dbController Completate | File Originale | Sostituito con | Chiamate | Stato | |---|---|---|---| | **MpDataService.cs** | 5 repository (Anag, System, Dossier, FluxLog, Production) | ~90 | Completato | | **TranslateSrv.cs** | `IMpVocRepository` | 7 | Completato | | **StatusData.cs** | `IMpMonRepository` | 10 | Completato | | **LandDataService.cs** | `IMpLandRepository` | 9 | Completato | | **OrderDataSrv.cs** | System + Production | 2 | Completato | | **ListSelectDataSrv.cs** | System + Production | 4 | Completato | ## Architettura DI (DataServiceCollectionExtensions.cs) ```csharp // Repository Scoped services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); servicesTryAddScoped(); services.TryAddScoped(); // Controllers MP.AppAuth - Scoped (dipendenze di AppAuthService) services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); // Servizi Singleton services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); // Servizi Scoped services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); ``` ## Livello MP.AppAuth - Refactoring DI Completato (Giugno 2026) ### Problema `AppAuthService` (Scoped) conteneva istanze statiche dei controller e li creava con `new()` nel costruttore, causando race condition e null reference errors. ### Fix Applicati | File | Problema | Fix | |------|----------|-----| | `AppAuthController.cs` | `static IConfiguration _configuration` sovrascritto da ogni istanza | `readonly IConfiguration _configuration` | | `MPController.cs` | `static IConfiguration _configuration` + `static dbController` | `readonly` istanza + dispose standard | | `AppUserController.cs` | `static IConfiguration = null!` | `readonly IConfiguration _configuration` | | `AppAuthService.cs` | Creava controllers con `new()` → bypassava DI | Constructor accetta controllers **via DI** | | `MpLandController.cs` (MP.Data) | `static IConfiguration _configuration` + Dispose che impostava null | `readonly IConfiguration` + dispose standard | | `BaseServ.cs` (MP.Data) | `protected static IConfiguration _configuration` | `protected IConfiguration` (istanza) | | `LandDataService.cs` (MP.Data) | `public static MpLandController dbController` vuoto | Campo rimosso | | `DataServiceCollectionExtensions.cs` (MP.Data) | `AppAuthService` non registrata con dipendenze | `AddLandDataLayer()` e `AddSpecDataLayer()` registrano controller + servizio | ### Livelli DI per progetto | Progetto | Estensione DI | Registrazione | |----------|--------------|---------------| | **MP.SPEC** | `AddSpecDataLayer()` | Repository + controllers + AppAuthService (Scoped) | | **MP.Land** | `AddLandDataLayer()` | Repository + controllers + AppAuthService (Scoped) | | **MP.MON** | `AddMonDataLayer()` | Repository + MonDataFeeder (Singleton) | | **MP.IOC** | `AddIocDataLayer()` | Repository + servizi IOC (Scoped/Singleton) | | **MP-PROG / MP-INVE / MP-STATS / MP-TAB3 / MP-RIOC / IobConf** | Registration nel respective Program.cs | Completa e funzionante | ## File Modificati per Fix DI - `MP.AppAuth/Controllers/AppAuthController.cs` (static → readonly) - `MP.AppAuth/Controllers/MPController.cs` (static → readonly, dispose corretto) - `MP.AppAuth/Controllers/AppUserController.cs` (static → readonly) - `MP.AppAuth/Services/AppAuthService.cs` (DI constructor injection) - `MP.Data/Controllers/MpLandController.cs` (static → readonly) - `MP.Data/Services/BaseServ.cs` (static → instancia) - `MP.Data/Services/LandDataService.cs` (campo statico rimosso) - `MP.Data/DataServiceCollectionExtensions.cs` (registrazioni DI corrette) ## File Nuovi (8) - `MP.Data/Repository/Anag/IAnagRepository.cs` - `MP.Data/Repository/Anag/AnagRepository.cs` - `MP.Data/Repository/Production/IProductionRepository.cs` - `MP.Data/Repository/Production/ProductionRepository.cs` - `MP.Data/Repository/Dossier/IDossierRepository.cs` - `MP.Data/Repository/Dossier/DossierRepository.cs` - `MP.Data/Repository/FluxLog/IFluxLogRepository.cs` - `MP.Data/Repository/FluxLog/FluxLogRepository.cs` - `MP.Data/Repository/System/ISystemRepository.cs` - `MP.Data/Repository/System/SystemRepository.cs` - `MP.Data/Repository/MpVoc/IMpVocRepository.cs` - `MP.Data/Repository/MpVoc/MpVocRepository.cs` - `MP.Data/Repository/MpMon/IMpMonRepository.cs` - `MP.Data/Repository/MpMon/MpMonRepository.cs` - `MP.Data/Repository/MpLand/IMpLandRepository.cs` - `MP.Data/Repository/MpLand/MpLandRepository.cs` ## Verifiche - ✅ Nessun riferimento a `dbController.XXX()` nei file di servizio - ✅ `ArticleWithDossierAsync` esportato correttamente (rimossi `#if false`) - ✅ `VocabolarioGetLang` reso sincrono (firma originale sincrona) - ✅ `tryLoadIobTags` in StatusData usa `GetAwaiter().GetResult()` (contesto sync) - ✅ `InitDict` in TranslateSrv usa `GetAwaiter().GetResult()` (contesto sync) - ✅ Tutti i 10 progetti buildano con 0 errori - ✅ Niente `static _configuration` nei controllers MP.AppAuth - ✅ Niente `new()` di controllers fuori dal DI - ✅ `AppAuthService` correttamente registrato in tutti le applicazioni ## MpSpecRepository (MpSpecController) I metodi sono ancora visibili nel file ma: - Non sono usati dai layer superiori (tutti migrati ai repository) - Possono essere spostati a `#if false` come ultima fase di pulizia - Rimangono come fallback documentato