Patroon anti-corruptielaag
Implementeert een façade- of adapterlaag tussen verschillende subsystemen die niet dezelfde semantiek delen. Deze laag vertaalt aanvragen die het ene subsysteem maakt naar het andere subsysteem. Gebruik dit patroon om ervoor te zorgen dat het ontwerp van een toepassing niet wordt beperkt door afhankelijkheden van externe subsystemen. Dit patroon werd voor het eerst beschreven door Eric Evans in Domain-Driven Design.
Context en probleem
De meeste toepassingen zijn voor sommige gegevens of functionaliteiten afhankelijk van andere systemen. Wanneer een oudere toepassing bijvoorbeeld wordt gemigreerd naar een modern systeem, heeft het mogelijk nog steeds bestaande oudere resources nodig. Nieuwe functies moeten het oude systeem kunnen aanroepen. Dit is vooral waar voor geleidelijke migratie, waarbij verschillende functies van een grotere toepassing in de loop van de tijd worden verplaatst naar een modern systeem.
Vaak lijden deze oudere systemen onder kwaliteitsproblemen zoals ingewikkelde gegevensschema's of verouderde API's. De functies en technologieën die worden gebruikt in oudere systemen kunnen sterk verschillen van moderne systemen. Als u wilt samenwerken met het oudere systeem, moet de nieuwe toepassing mogelijk verouderde infrastructuur, protocollen, gegevensmodellen, API's of andere functies ondersteunen die u anders niet in een moderne toepassing zou plaatsen.
Het beheren van toegang tussen de nieuwe en bestaande systemen kan het nieuwe systeem dwingen om in overeenstemming te zijn met ten minste een deel van de API's of andere semantiek van het oude systeem. Wanneer deze verouderde functies kwaliteitsproblemen hebben, 'corrumpeert' het ondersteunen hiervan iets, wat anders een goed ontworpen moderne toepassing is.
Vergelijkbare problemen kunnen zich voordoen met elk extern systeem dat uw ontwikkelteam niet controleert, niet alleen oudere systemen.
Oplossing
Isoleer de verschillende subsystemen door er een anti-corruptielaag tussen te plaatsen. Deze laag vertaalt de communicatie tussen de twee systemen, waardoor het ene systeem ongewijzigd kan blijven, terwijl het andere kan voorkomen dat het ontwerp en de technologische benadering in gevaar komen.

In het bovenstaande diagram ziet u een toepassing met twee subsystemen. Subsysteem A roept subsysteem B aan via een anti-corruptielaag. Communicatie tussen subsysteem A en de anti-corruptielaag maakt altijd gebruik van het gegevensmodel en de architectuur van subsysteem A. Aanroepen van de anti-corruptielaag naar subsysteem B voldoen aan het gegevensmodel of de methoden van dat subsysteem. De anti-corruptielaag bevat alle logica die nodig is voor de omzetting tussen de twee systemen. De laag kan worden geïmplementeerd als een onderdeel in de toepassing of als een onafhankelijke service.
Problemen en overwegingen
- De anti-corruptielaag voegt mogelijk latentie toe aan aanroepen tussen de twee systemen.
- De anti-corruptielaag voegt een extra service toe die moet worden beheerd en onderhouden.
- Overweeg hoe uw anti-corruptielaag wordt geschaald.
- Overweeg of u meer dan één anti-corruptielaag nodig heeft. Het is misschien raadzaam om functionaliteit in meerdere services op te delen met behulp van verschillende technologieën of talen, of mogelijk zijn er andere redenen voor het partitioneren van de anti-corruptielaag.
- Houd rekening met hoe de anti-corruptielaag wordt beheerd met betrekking tot uw andere toepassingen of services. Hoe wordt de laag geïntegreerd in uw bewakings-, publicatie- en configuratieprocessen?
- Zorg ervoor dat transactie- en gegevensconsistentie worden bewaard en kunnen worden gecontroleerd.
- Overweeg of de anti-corruptielaag alle communicatie tussen verschillende subsystemen of slechts een subset van functies moet verwerken.
- Als de anti-corruptielaag deel uitmaakt van een strategie voor toepassingsmigratie, moet u overwegen of deze permanent zal zijn of wordt gestopt nadat alle verouderde functionaliteit is gemigreerd.
Wanneer dit patroon gebruiken
Gebruik dit patroon wanneer:
- Een migratie is gepland om in meerdere fasen te gebeuren, maar de integratie tussen nieuwe en bestaande systemen moet worden onderhouden.
- Twee of meer subsystemen hebben verschillende semantiek, maar moeten nog wel communiceren.
Dit patroon is mogelijk niet geschikt als er geen belangrijke semantische verschillen tussen nieuwe en bestaande systemen zijn.