L'Anti-Corruption Layer (ACL) è un pattern architetturale che viene utilizzato per proteggere il modello di dominio interno dell'applicazione dall'influenza dei sistemi esterni durante l'integrazione.
A cosa serve: Quando il tuo sistema interagisce con altri (ad esempio, eredita dati e logica di business da software obsoleti o servizi esterni), il contratto esterno può cambiare o contenere distorsioni. L'ACL consente di isolare il modello interno dai cambiamenti incompatibili con la tua logica di business.
Come implementarlo: Vengono introdotti componenti aggiuntivi - adattatori e facciate - che trasformano i dati/ interfacce esterni in oggetti interni. Questi possono essere servizi, mapper, classi DTO speciali.
Esempio in Python:
class ExternalOrder: def __init__(self, order_id, amount, created_at): self.order_id = order_id self.amount = amount self.created_at = created_at class InternalOrder: def __init__(self, id, total, timestamp): self.id = id self.total = total self.timestamp = timestamp class OrderAdapter: @staticmethod def from_external(external_order): return InternalOrder( id=external_order.order_id, total=external_order.amount, timestamp=external_order.created_at )
Qui OrderAdapter isola il sistema interno dalle modifiche nella struttura dell'ordine esterno.
Caratteristiche chiave:
Si può semplicemente usare un layer di mapper POJO/DTO invece di un ACL completo?
No, i semplici mapper non proteggono la logica di business e non sono adattatori a tutti gli effetti. L'ACL è uno strato coeso che implementa un'integrazione protetta, inclusa la trasformazione contestuale di comandi, eventi e errori di business.
Quanti livelli di trasformazione è consentito utilizzare in un ACL?
Tanti quanti ne servono per garantire un isolamento completo. Di solito sono almeno due: trasformazione della struttura e mapping della logica di business (ad esempio, stati, codici di errore e politiche di accesso).
Come gestire correttamente gli errori dei sistemi esterni in un ACL?
L'ACL deve intercettare e adattare gli errori esterni alle classi di eccezione interne o ai codici di stato. Non passare mai direttamente gli errori dei sistemi esterni all'interno della tua applicazione.