Anti-Corruption Layer: proteggere il nuovo dominio dal legacy
L'Anti-Corruption Layer isola il modello moderno dai concetti, codici e strutture del legacy, traducendo entrambi i lati attraverso un confine esplicito.
Il problema che risolve
Quando un nuovo servizio integra un legacy è facile importarne la semantica: nomi di colonne, codici storici, chiavi composte, stati ambigui e regole nate per vincoli tecnici. Se questi concetti entrano nel nuovo dominio, il refactor diventa una copia più moderna del vecchio sistema.
Che cosa fa l'ACL
L'Anti-Corruption Layer è un confine di traduzione tra due modelli. Il nuovo dominio parla il proprio linguaggio; l'ACL conosce il linguaggio legacy e lo converte. Può contenere mapper, translator, client, assembler e regole di equivalenza. È intenzionalmente il luogo dove concentrare la conoscenza che vogliamo eliminare in futuro.
Esempio sanitario
Un legacy può identificare un ricovero con anno, progressivo e codice struttura. Il nuovo ADT può invece usare un EncounterId stabile. L'ACL riceve l'identificativo di dominio, traduce verso la chiave legacy quando deve interrogare il vecchio sistema e rimappa la risposta in Encounter, Admission, Transfer e Discharge. Il dominio ADT non deve conoscere la composizione della chiave storica.
ACL non è un semplice Adapter
Adapter: rende compatibili due interfacce o protocolli; per esempio trasforma una porta OrderIntegrationPort in una chiamata HL7/MLLP.
ACL: protegge una semantica; per esempio traduce stati, identificativi, regole e significati tra due modelli differenti.
Un ACL può usare uno o più Adapter al suo interno.
Regole di progettazione
Il dominio moderno non importa classi, DTO o enum del legacy.
I mapper legacy vivono nel modulo ACL, non nel core domain.
Le equivalenze non ovvie sono testate con casi reali e fixture anonimizzate.
Le anomalie di traduzione sono osservabili e non vengono nascoste con fallback silenziosi.
L'ACL ha una strategia di retirement: deve poter sparire quando il legacy viene spento.
Errore frequente
Creare un DTO chiamato NewPatient ma con gli stessi cinquanta campi e codici del legacy non è un ACL: è una rinomina. La traduzione deve avvenire verso concetti del nuovo dominio, non verso una copia cosmetica della struttura precedente.
Dove posizionarlo
In una Hexagonal Architecture l'ACL appartiene normalmente agli adapter esterni. Il domain layer vede una Port, per esempio LegacyEncounterLookup; l'implementazione usa ACL e adapter di protocollo per parlare con il sistema storico.
